RecyclerView获取某个item的VIewHolder、View为什么会为空

转载 :https://blog.csdn.net/z979451341/article/details/79099201

就一句话,这个Item是否可见,可见获取得到,不可见获取为空

平常我们使用RecyclerView的findViewHolderForAdapterPosition(int position)获取ViewHolder,使用LayoutManager的findViewByPosition(int position)获取itemView,通过这些函数之所以可能获取为空,因为这个position参数对应的item不可见,就算之前滑动显示过,如果调用函数的时候这个item不可见,那获取的值就是为空。


还有其他RecyclerView、LayoutManager获取某个item的VIewHolder、View的函数都是有这个特性。接下来我通过实例来证明,完整代码最后贴出

1.获取ViewHolder为空

我给Item设置点击事件,点击对应的Item,会把item的背景颜色设置为红色。这个时候你不管怎么点程序运行正常,不会报空指针错误

  1. adapter.setItemClick(new ItemClick() {
  2. @Override
  3. public void click(int position) {
  4. //获取ViewHolder
  5. MyAdapter.MyViewHodler viewHodler = (MyAdapter.MyViewHodler) recyc.findViewHolderForAdapterPosition(position);
  6. viewHodler.ll.setBackgroundColor(Color.RED);
  7. }
  8. });

如果我们在这个点击事件里,设置为把最后一个item的背景颜色设置为红色,还有就是我们看不到最后一个item,一点就崩溃,就算我们滑到最底部,然后滑到最上面,再点击还是会崩溃。

所以不是缓不缓存view,而是这个item可不可见

  1. MyAdapter.MyViewHodler viewHodler = (MyAdapter.MyViewHodler) recyc.findViewHolderForAdapterPosition(dataBeans.size() - 1);
  2. viewHodler.ll.setBackgroundColor(Color.RED);

如果我们使用的LayoutManager是LInearLayoutManager,我们可以通过函数知道第一个可见的item和最后一个可见的item

  1. int now = dataBeans.size() - 1;
  2. if (layoutManager.findFirstVisibleItemPosition() <= now && layoutManager.findLastVisibleItemPosition() >= now) {
  3. MyAdapter.MyViewHodler viewHodler = (MyAdapter.MyViewHodler) recyc.findViewHolderForAdapterPosition(dataBeans.size() - 1);
  4. viewHodler.ll.setBackgroundColor(Color.RED);
  5. }

2.获取View为空

点击item,获取这个item的view,设置背景颜色

  1. adapter.setItemClick(new ItemClick() {
  2. @Override
  3. public void click(int position) {
  4. View view = layoutManager.findViewByPosition(position);
  5. view.setBackgroundColor(Color.RED);
  6. }
  7. });
如果获取不可见的item,获取为空
  1. View view = layoutManager.findViewByPosition(dataBeans.size() - 1);
  2. view.setBackgroundColor(Color.RED);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值