因为现在做的APP,属于OA员工管理类型的.所以肯定会包含批量选择.
在批量选择时,遇到了很多BUG.在这不得不承认小白就是小白.很简单的问题,就是差自己记录下来了.
尤其是选中后滑动,checkBox会改变postion
很尴尬-.-
public Map<Integer, Boolean> map = new LinkedHashMap<>();
private boolean isShowCheckBox;
public Map<Integer, String> selectMap = new LinkedHashMap<>();
public Map<Integer, Integer> contrastMap = new LinkedHashMap<>();
public boolean isShowCheckBox() {
return isShowCheckBox;
}
public void setIsShowCheckBox(boolean isShowCheckBox) {
this.isShowCheckBox = isShowCheckBox;
}
/**这些Map都是用来储存状态或者位置的.
要通过这些判断是否往那个选中的List里添加数据
下面才重点
**/
check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
//重写check选择或取消更改时的监听
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
map.put(holder.getPosition(), isChecked);
/**用一个map来记录Item在Listview里的位置,以及选择状态
public Map<Integer, Boolean> map = new LinkedHashMap<>();
private boolean isShowCheckBox;**/
if (!contrastMap.containsKey(u.getUserID())) {
contrastMap.put( u.getUserID(),holder.getPosition());
}
if (contrastMap.get(u.getUserID()) == holder.getPosition())
if (isChecked) {
selectMap.put(u.getUserID(), u.getTrueName());
} else {
if (selectMap.containsKey(u.getUserID())) {
selectMap.remove(u.getUserID());
}
}//上面这2个if就不说了,就是循环检查是否选中的
//至于getUserID,getTrueName就是实体类里的get,set.大家自行调整.
//holder.getPosition();是基类里的复用ContView时候的Holder,获取的位置.
}
});
/**重点是这
* 一定要把选中的状态设置放在监听方法下面.
* Listview是复用的.conteView就那几个,只是更换显示内容.
* 如果先设置状态,在走监听.
* 那么当顶上那个Item滑出屏幕,重新复用到屏幕最下方的时候,就会把已选中的第一Item的 isShowCheckBox的状态更改.
*
* **/
if (isShowCheckBox) {
check.setVisibility(View.VISIBLE);
} else {
check.setVisibility(View.GONE);
}
if (map.containsKey(holder.getPosition())) {
check.setChecked(map.get(holder.getPosition()));
} else {
check.setChecked(false);
}
本来之前就写好了已经再用了,可是还是会偶尔出错!
因为我就是把设置状态和监听颠倒了.
所以才会注释那么多.就是想给解决的朋友们一个提醒.
这个方法网上也有解决,就是看了网上才知道自己错的多么可笑.