LISTVIEW的单选和多选

使用LISTVIEW会遇到单选和多选的情况:

前提: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);
}
}
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值