您的位置:首页 > 移动开发 > Android开发

Android ListView在有checkbox的情况下上下滑动选中状态错误以及position错乱

2016-12-11 19:26 603 查看
在处理有checkbox的ListViewd的时候,如果我们选中了上面几个checkbox,下拉到后面,一些在下面的checkbox也会出现选中的状态,这是由于checkbox控件复用的缘故,解决这个问题有以下方式:

1、在数据源对象中设置一个boolean变量记录checkbox是否选中,然后在getView中添加以下代码:

cb.setChecked(bean.isCheck());
cb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bean.setIsCheck(cb.isChecked());
}
});


2、在adapter中新建一个列表存储点击情况,然后根据存储的情况设置checkbox的点击:

private List<Integer> mPostions = new ArrayList<>();


在getView中添加以下代码:

cb.setChecked(false);
if (mPostions.contains(viewHolder.getPosition())) {
cb.setChecked(true);
}
cb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (cb.isChecked()) {
mPostions.add(viewHolder.getPosition());
} else {
mPostions.remove((Integer) viewHolder.getPosition());
}
}
});
以上代码基于共同适配器,没有共同适配器的情况,请用getView里面的参量position代替viewHolder.getPosition()

第一种方式比较简洁,如果不能添加对象变量的情况下使用第二种

在使用ListView删除的时候,也碰到pos错乱的问题,直接导致了删除的时候数组出界了。

@OnItemLongClick(R.id.list_allreserves)
public boolean deleteReserve(final int position) {
isMenuMode = true;
// viewstub还没有加载
if (mMenu == null) {
((ViewStub) findViewById(R.id.stub_menu)).inflate();
mMenu = findViewById(R.id.flyt_menu);
mMenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
hideMenu();
}
});
((TextView) findViewById(R.id.tv_menu_delete)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 移除预约
mDatas.remove(position);
refreshList();
hideMenu();
}
});
}
mMenu.setVisibility(View.VISIBLE);
return true;
}


以上是错误代码,产生问题的关键是,传入的position是正确的,但是到达onClick里面的时候,position就和外面的传参不一样了,查不出来原因,现在的解决办法是,设置一个全局变量在外面,记录一下传入函数的position,在onClick里面使用全局变量。

@OnItemLongClick(R.id.list_allreserves)
public boolean deleteReserve(int position) {
// 是否本人操作检查 TODO
isMenuMode = true;
currentPosition = position;
// viewstub还没有加载
if (mMenu == null) {
((ViewStub) findViewById(R.id.stub_menu)).inflate();
mMenu = findViewById(R.id.flyt_menu);
mMenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
hideMenu();
}
});
((TextView) findViewById(R.id.tv_menu_delete)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 移除预约
if (currentPosition != -1) {
mDatas.remove(currentPosition);
currentPosition = -1;
}
refreshList();
hideMenu();
}
});
}
mMenu.setVisibility(View.VISIBLE);
return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息