Android ListView在ActionMode时改变项目View背景颜色的处理方式

Android中的ListView与iOS的UITableView提供了实现类似功能的方法,但在iOS中,表格控件的编辑状态一般都是通过菜单项触发的,而在Android中,则可以使用叫做ActionMode的行为(一般是长按列表项触发)进入表格项编辑状态,然后可以进行一些如多选批量删除之类的操作,方便快捷。进入ActionMode后,需要对列表项的选中状态进行图形上的表示,如加入选中标记,改变选中项背景颜色等,实现此操作需要配合AbsListView.MultiChoiceModeListener的事件通知及ListAdapter的getView操作:

测试ActionMode时我使用的是系统提供封装了ListView的ListFragment,choiceMode是multipleChoiceModal,直接使用ListView及multipleChoice模式时可供参考。

            getListView().setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
                @Override
                public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
                    mode.invalidate();
//                    if (checked)
//                        getListView().getChildAt(position).setBackgroundColor(getResources().getColor(R.color.primary));
//                    else
//                        getListView().getChildAt(position).setBackgroundColor(Color.TRANSPARENT);
                    adapterItem.notifyDataSetChanged();
                }
                @Override
                public void onDestroyActionMode(ActionMode mode) {
                    getListView().clearChoices();
                }
}
            public View getView(int position, View convertView, ViewGroup parent) {
                ViewHolderItem viewHolder;

                ...

                if (getListView().isItemChecked(position))
                    convertView.setBackgroundColor(getResources().getColor(R.color.primary));
                else
                    convertView.setBackgroundColor(Color.TRANSPARENT);

                return convertView;
            }

以上就是两部分关键代码,第一部分响应进入ActionMode时的列表项选中状态变化并调用ListAdapter的notifyDataSetChanged更新显示,并在onDestroyActionMode退出ActionMode时(可以是ActionBar上的返回按钮,也可以是物理的back键)clearChoices清除选中状态。第二部分在getView时判断当前position的item是否为选中状态,并对项目View进行对应的处理。
其中第一部分中注掉的代码是在参考其他介绍ActionMode的文章时的操作方式,本以为这样可以不调用notifyDataSetChanged而降低一些getView的调用,但是后来发现不在getView中配合notifyDataSetChanged处理的话,会导致退出ActionMode时无法正确清除项目选中状态。

博主友情提示:

如在您的评论中需要提及如QQ号、微信号、电子邮件地址或其他隐私敏感信息,欢迎通过>>博主专用加密工具v2<<加密后发布,原文只有博主可以看到。