RecyclerView是我们用到比较频繁的控件之一,有时获取某个子View或其对应的position时往往达不到预期的结果。
之前写的这个万能分割线XRecyclerViewDivider也遇到了这些问题,接下来详细说下几个方法的意义吧。
- RecycleView的getChildAt(position)
这个方法在RecycleView未满一屏的时候是没有问题的,可以正确地拿到position对应地View,但是在满一屏地情况下,getChildAt(position)获取的View是null。
因为getChildAt(position)这个方法其实只能get到当前屏幕所展示的view。
- RecycleView的getChildCount()
用这个方法去遍历Item的时候,往往会发现返回item的数量与实际数量不相符,这是为什么呢?
getChildCount()实际上返回的是整数的可见的item数量,所以导致和实际的数量不一致,这个方法一般会和getChildAt(int index)一起使用的,它们的意义是一一对应的,都和可见View有关系。
- RecyclerView适配器getAdapter().getItemCount()
RecyclerView适配器的getItemCount()是可以正确获取到全部的item数量的,不管item是否可见,要想获取子View我们可以遍历item来获取,这样也是可以的。
- LayoutManager的findViewByPosition(position)
如果要获取position下的子View,我们可以用LayoutManager的findViewByPosition(position)方法,因为LayoutManager是RecyclerView的布局管理器,其子View的布局都归LayoutManager管理。
所以我们可以使用此方法获取当前position下对应的View。
- 获取正确的position
要想获取正确的position,我们可以采用3的item遍历方法,如果知道了View实例,也可采用如下方法:
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
//这个才是真正的layout position
int itemPosition = params.getViewLayoutPosition();
上面讲诉了几个方法的意义,我们可以灵活使用这几个方法来获取我们想要的RecyclerView的子View对象、item数量和View对应的position。