我有一个recylcerview,在这个视图中,下面所示的方法将在每一个项的选择上被调用。只有当我没有滚动回收视图时,这个方法才能成功地运行,所以第一个可见的是0。当我向下滚动并选择在方法中正确设置的第一个和最后一个可见的内容时,但是可以在屏幕截图中看到,原因是我不理解childAt返回null,而不是我在应用程序屏幕上看到的视图。在第7位置的截图中,第一个4-6返回了一个孩子.
有人能向我解释一下怎么会发生这种事吗?从我的pov中,getChildAt()应该总是在这个场景中返回一个视图。
发布于 2022-06-06 17:11:23
first
和last
将是数据的适配器位置,而不是布局管理器中列出的位置。见LinearLayoutManager#findFirstVisibleItemPosition。孩子们总是从零开始,从那里开始增加。
这就是为什么它在滚动之前工作,因为布局管理器中第零索引处的子项也是适配器中的第零项。
这里是关于RecyclerView中各种位置的讨论。
看起来,您需要对所有可见项进行更改。您的first
和last
变量将具有与屏幕上可见的内容相对应的正确的开始/结束适配器位置。您需要适配器位置来调用各种“通知”方法。
因此,给定适配器位置,我们需要一个映射到屏幕上表示的视图。例如,以下代码循环遍历每个可见视图,并更改每个视图的背景色。
LinearLayoutManager lm = (LinearLayoutManager) Recycler.getLayoutManager();
// Get adapter positions for first and last visible items on screen.
int firstVisible = lm.findFirstVisibleItemPosition();
int lastVisible = lm.findLastVisibleItemPosition();
for (int i = firstVisible; i <= lastVisible; i++) {
// Find the view that corresponds to this position in the adapter.
View visibleView = lm.findViewByPosition(i);
visibleView.setBackgroundColor(getResources().getColor(android.R.color.holo_red_light));
}
如果使用布局管理器的子方法,则需要从零循环到LayoutManager.getChildCount() - 1
进行更改。你会看到每一个附加的视图,我相信,它可以超过可见视图的数量。
https://stackoverflow.com/questions/72520096
复制相似问题