使用LISTVIEW会遇到单选和多选的情况:
前提:LISTVIEW和ADAPTER(建议用自己写的,方便控制)
一.单选
二.多选
填充数据的时候,数组初始化,并调用父类刷新
选中数据的时候,将KEY-VALUE放进数组,再调用父类刷新
另外的一种办法: 使用一个MAP存放选中的内容,然后获取flag再标记,这样会出现一个问题,软键盘的消失会重新绘制ADAPTER,导致选中的丢失,故多选的办法我觉得要好点
前提: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);
}
}
});