君莫笑

《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));

                        }

                }

            });

        }

 

评论