Recycleview ViewHolder复用出现item选中
2018-01-03 本文已影响324人
Endeav0r
前两个是其他大神提到很多的方法,不推荐使用。
方法一:
holder.setIsRecyclable(false);
暴力解决,使viewholder不进行复用,也不存在混乱选中的问题了,但是 滑动卡的要死。
方法二:
在JavaBean中设置一个变量,相当于一个标志位,但是需要修改bean 。虽然只是加个字段的问题,但是不建议。
方法三:
1.在Adapter中创建一个list记录选中的item的position,
private List<Integer> checkIds = new ArrayList<>();
2.然后onBindViewHolder方法中,根据list中是否包含当前position来显示是否选中的状态
if (checkIds.contains(holder.getLayoutPosition()))
expand.expand();// checkBox.setChecked(true);
else
expand.collapse();// checkBox.setChecked(false);
3.选中点击事件,选中则add到list,未选择则remove,注意这里添加和remove的是Integer对象,因为list.remove()方法既可以传对象,又可以传集合元素索引,这里不要混淆。
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (expand.isExpanded()) {
checkIds.remove(Integer.valueOf(holder.getLayoutPosition()));
}else {
checkIds.add(holder.getLayoutPosition());
}
L.show("position==" + holder.getPosition());
expand.toggle();
}
});
other:上面是多选方法,下面继续补充一种单选方法
a.gif1.在Adapter中创建一个int成员变量记录选中的item的position,和ItemView根布局实例对象。
private int checkId = -1;
private ExpandableLayout oldView;
2.然后onBindViewHolder方法中,根据记录的checkId显示是否选中的布局
if (checkId == holder.getLayoutPosition())
expand.expand(false);
else
expand.collapse(false);
3.item条目点击事件(主要)
holder.getView(R.id.mTranItemContent).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (oldView != null && checkId != holder.getLayoutPosition())// 判断上一次点击选中的View是不是自己
oldView.collapse();// 将上一次选中的item取消掉
expand.toggle(); // 切换当前item的状态
if (expand.isExpanded()) {// 切换之后判断状态,如果是checked状态,就记录当前item信息
checkId = holder.getLayoutPosition();
oldView = expand;
} else {
checkId = -1;
oldView = null;
}
}
});