前兩個是其他大神提到很多的方法,不推薦使用。
方法一:
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.gif
1.在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;
}
}
});