RecyclerView在使用适配器设置完成后显示其项目时是否有callback?

背景

我制作了一个显示RecyclerView的快速滚动的库( 在这里 ,如果有人想要的话),我想决定什么时候显示,什么时候隐藏快速滚动。

我认为一个很好的决定是,如果有些项目没有在屏幕上显示(或者有很多没有出现),那么在RecyclerView完成其布局过程后,我会设置快速滚动条是可见的,如果所有项目已经显示,则不需要显示它。

问题

我找不到RecyclerView的监听器/callback,告诉我什么时候它已经完成显示项目,以便我可以检查显示项目数与项目数的比较。

当键盘出现并隐藏时,recyclerView也可能改变其大小。

我试过了

滚动侦听器可能无法帮助,因为它“始终”发生,我只需要检查RecyclerView是否已经改变其大小或当项目数(或数据)已经改变。

我可以用一个布局来包装RecyclerView,这个布局会通知我尺寸的变化,就像我所做的那样,但是我不认为它会起作用,因为RecyclerView可能还没准备好告诉我有多less物品可见。

检查显示的项目数量的方法可以这样使用:

final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false); mRecyclerView.setLayoutManager(layoutManager); ... Log.d("AppLog", "visible items count:" + (layoutManager.findLastVisibleItemPosition() -layoutManager.findFirstVisibleItemPosition()+1)); 

这个问题

如何在recyclerView完成显示其子视图时得到通知,以便我可以根据当前显示的内容来决定显示/隐藏快速滚动条?

Solutions Collecting From Web of "RecyclerView在使用适配器设置完成后显示其项目时是否有callback?"

我find了一种方法来解决这个问题(感谢用户pskink ),通过使用LayoutManager的callback:

 final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false) { @Override public void onLayoutChildren(final Recycler recycler, final State state) { super.onLayoutChildren(recycler, state); //TODO if the items are filtered, considered hiding the fast scroller here final int firstVisibleItemPosition = findFirstVisibleItemPosition(); if (firstVisibleItemPosition != 0) { // this avoids trying to handle un-needed calls if (firstVisibleItemPosition == -1) //not initialized, or no items shown, so hide fast-scroller mFastScroller.setVisibility(View.GONE); return; } final int lastVisibleItemPosition = findLastVisibleItemPosition(); int itemsShown = lastVisibleItemPosition - firstVisibleItemPosition + 1; //if all items are shown, hide the fast-scroller mFastScroller.setVisibility(mAdapter.getItemCount() > itemsShown ? View.VISIBLE : View.GONE); } }; 

这里的好处是,它运作良好,并将处理甚至键盘显示/隐藏。

不好的一面是,它会被调用到不感兴趣的情况下(意味着它有误报),但不像滚动事件那样频繁,所以对我来说已经足够了。