【Android】 RecyclerView、ListView实现单选列表的优雅之路

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()) {

mSelectedPos = i;

}

}

⑶onClick里代码如下:

//实现单选方法二: notifyItemChanged() 定向刷新两个视图

//如果勾选的不是已经勾选状态的Item

if (mSelectedPos!=position){

//先取消上个item的勾选状态

mDatas.get(mSelectedPos).setSelected(false);

notifyItemChanged(mSelectedPos);

//设置新Item的勾选状态

mSelectedPos = position;

mDatas.get(mSelectedPos).setSelected(true);

notifyItemChanged(mSelectedPos);

}

本方案由于调用了notifyItemChanged(),所以还会伴有“白光一闪”的动画。

方案优点:

本方案,较优雅了,不会重走一屏可见的Item的getView()/onBindViewHolder()方法,

但仍然会重走需要修改的两个ItemgetView()

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值