前提:LISTVIEW和ADAPTER(建议用自己写的,方便控制)
一.单选
/** ADAPTER部分 */ private int selectedIndex = -1; //定义一个标记 //适合单选 public void setSelectedIndex(int ind) { selectedIndex = ind; notifyDataSetChanged(); } @Override public View getView(int position, View convertView, ViewGroup parent) { ............ if (selectedIndex == position) { flag.setVisibility(View.VISIBLE); } else { flag.setVisibility(View.INVISIBLE); } ......... } /** ACTIVITY 或 Fragment */ adapter.setSelectedIndex(position); adapter.notifyDataSetChanged();
二.多选
填充数据的时候,数组初始化,并调用父类刷新
选中数据的时候,将KEY-VALUE放进数组,再调用父类刷新
/** ADAPTER部分 */ private SparseArray<Integer> sparseArray;//定义一个数组 /** * 重写:用于列表更新 * 这样就可以清理掉已选的标签 */ @Override public void notifyDataSetChanged() { this.sparseArray = new SparseArray<Integer>(); super.notifyDataSetChanged(); } /** * 适合多选 * 调用父类的notifyDataSetChanged 去处理显示 * * @param position */ public void setMultiSelected(int position) { if (sparseArray.get(position) != null) { //在里面 清理 sparseArray.delete(position); } else { sparseArray.append(position, position); } super.notifyDataSetChanged(); } @Override public View getView(int position, View convertView, ViewGroup parent) { ............ if (sparseArray.get(houseInfo.houseId) != null) { flag.setVisibility(View.VISIBLE); } else { flag.setVisibility(View.INVISIBLE); } .......... } /** ACTIVITY 或 Fragment */ //数据刷新什么的使用 adapter.notifyDataSetChanged(); //选中什么的使用 adapter.setMultiSelected(houseInfo.houseId);
另外的一种办法: 使用一个MAP存放选中的内容,然后获取flag再标记,这样会出现一个问题,软键盘的消失会重新绘制ADAPTER,导致选中的丢失,故多选的办法我觉得要好点
xxxxListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { Object object= (object) adapterView.getAdapter().getItem(position); View flag = view.findViewById(R.id.flag); if (checkMap.get(object.id) != null) { flag.setVisibility(View.INVISIBLE); checkMap.remove(object.id); } else { flag.setVisibility(View.VISIBLE); checkMap.append(object.id, object); } } });