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号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。