Log.d(“TAG”, “onBindViewHolder() called with: holder = [” + holder + “], position = [” + position + “]”);
holder.ivSelect.setSelected(mDatas.get(position).isSelected());//“CheckBox”
holder.tvCoupon.setText(mDatas.get(position).getName());//TextView
holder.ivSelect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//实现单选,第一种方法,十分简单, Lv Rv通用,因为它们都有notifyDataSetChanged()方法
// 每次点击时,先将所有的selected设为false,并且将当前点击的item 设为true, 刷新整个视图
for (TestBean data : mDatas) {
data.setSelected(false);
}
mDatas.get(position).setSelected(true);
notifyDataSetChanged();
}
});
ViewHolder:
public static class CouponVH extends RecyclerView.ViewHolder {
private ImageView ivSelect;
private TextView tvCoupon;
public CouponVH(View itemView) {
super(itemView);
ivSelect = (ImageView) itemView.findViewById(R.id.ivSelect);
tvCoupon = (TextView) itemView.findViewById(R.id.tvCoupon);
}
}
方案优点:
简单粗暴
方案缺点:
其实需要修改的Item只有两项:
一个当前处于选中状态的Item->普通状态
再将当前手指点击的这个Item->选中状态
但采用普通方案,则会刷新整个一屏可见的Item,重走他们的getView()/onBindViewHolder()
方法。
其实一个屏幕一般最多可见10+个Item,遍历一遍也无伤大雅。
但咱们还是要有追求优雅的心,所以我们继续往下看。
2 利用Rv的notifyItemChanged()定向刷新:
本方案可以中速阅读
⑴本方案需要在Adapter里新增一个字段:
private int mSelectedPos = -1;//实现单选 方法二,变量保存当前选中的position
⑵在设置数据集时(构造函数,setData()方法等:),初始化 mSelectedPos
的值。
//实现单选方法二: 设置数据集时,找到默认选中的pos
for (int i = 0; i < mDatas.size(); i++) {
if (mDatas.get(i).isSelected()) {
mSelec