《Android编程权威指南》勘误(1)
这本书的名字好装逼......错误页码:P257;
错误章节:第十八章“上下文菜单与上下文操作模式”(Context Menu and Cotextual Action Mode)
勘误代码:
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB)
registerForContextMenu(LV_listView);
else
{
/*
* 在删除被选择的ListView条目时,原书中内容为:
* for(int i = adapter.getCount()-1; i >= 0 ; i++)
* {
* if(getListView().isItemChecked(i))
* {
* crimeLab.deleteCrime(adapter.getItem(i));
* }
* }
* 但根据Goolge的文档:AbsListView.isItemChecked方法只在CHOICE_MODE_SINGLE 跟 CHOICE_MODE_MULTIPLE下起作用。
* 原文:The result is only valid if the choice mode has been set to CHOICE_MODE_SINGLE or CHOICE_MODE_MULTIPLE.
* 因此,我在匿名内部类中定义了一个ArrayList<Crime> list2Delete来手动保存被选中的Crime对象
*/
Log.d(TAG,"创建ActionMode菜单");
LV_listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
LV_listView.setMultiChoiceModeListener(
new MultiChoiceModeListener() {
//记录被选中的Crime,
ArrayList<Crime> list2Delete = new ArrayList<Crime>();
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.fragment_crime, menu);
//注意默认返回值是false,但是我们自己定义了菜单,所以要返回true
return true;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch(item.getItemId())
{
case(R.id.fragment_menu_delele):
{
//1,取得ListView的Adapter
MyCrimeListAdapter adapter = (MyCrimeListAdapter)getListAdapter();
//2,拿到CrimeLab对象
CrimeLab lab = CrimeLab.getInstance(getActivity());
Log.d(TAG,"总共选中了:"+LV_listView.getCheckedItemCount()+"个对象");
//3,挨个删除被选择的列表项目
for(int i = 0;i < list2Delete.size() ; i++)
{
lab.deleteCrime(list2Delete.get(i));
}
//4,删除完成后就关闭ActionMode
mode.finish();
//5,更新列表数据
adapter.notifyDataSetChanged();
return true;
}
default:
return false;
}
}
/**
* 复写ListView的Item状态变化方法:根据Item状态进行保存
*/
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position,
long id, boolean checked) {
Log.d(TAG,"第"+position+"被选中,状态 == "+checked);
MyCrimeListAdapter adapter = (MyCrimeListAdapter)LV_listView.getAdapter();
if(checked)
{
list2Delete.add((Crime)adapter.getItem(position));
}
else
{
list2Delete.remove((Crime)adapter.getItem(position));
}
}
});
}
评论