转载 :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的背景颜色设置为红色。这个时候你不管怎么点程序运行正常,不会报空指针错误
-
adapter.setItemClick(new ItemClick() {
-
@Override
-
public void click(int position) {
-
//获取ViewHolder
-
MyAdapter.MyViewHodler viewHodler = (MyAdapter.MyViewHodler) recyc.findViewHolderForAdapterPosition(position);
-
viewHodler.ll.setBackgroundColor(Color.RED);
-
-
}
-
});
如果我们在这个点击事件里,设置为把最后一个item的背景颜色设置为红色,还有就是我们看不到最后一个item,一点就崩溃,就算我们滑到最底部,然后滑到最上面,再点击还是会崩溃。
所以不是缓不缓存view,而是这个item可不可见
-
MyAdapter.MyViewHodler viewHodler = (MyAdapter.MyViewHodler) recyc.findViewHolderForAdapterPosition(dataBeans.size() - 1);
-
viewHodler.ll.setBackgroundColor(Color.RED);
如果我们使用的LayoutManager是LInearLayoutManager,我们可以通过函数知道第一个可见的item和最后一个可见的item
-
int now = dataBeans.size() - 1;
-
if (layoutManager.findFirstVisibleItemPosition() <= now && layoutManager.findLastVisibleItemPosition() >= now) {
-
MyAdapter.MyViewHodler viewHodler = (MyAdapter.MyViewHodler) recyc.findViewHolderForAdapterPosition(dataBeans.size() - 1);
-
viewHodler.ll.setBackgroundColor(Color.RED);
-
}
2.获取View为空
点击item,获取这个item的view,设置背景颜色
-
adapter.setItemClick(new ItemClick() {
-
@Override
-
public void click(int position) {
-
View view = layoutManager.findViewByPosition(position);
-
view.setBackgroundColor(Color.RED);
-
}
-
});
-
View view = layoutManager.findViewByPosition(dataBeans.size() - 1);
-
view.setBackgroundColor(Color.RED);