Android 检测RecyclerView';s GridLayoutManager带有SuperSLiM库的滚动结束

Android 检测RecyclerView';s GridLayoutManager带有SuperSLiM库的滚动结束,android,scroll,android-recyclerview,gridlayoutmanager,superslim,Android,Scroll,Android Recyclerview,Gridlayoutmanager,Superslim,我已经搜索了一段时间,但找不到一个解决方案来检测网格布局管理器的回收器视图的滚动结束。使用下面的代码实际上是可行的,但它适用于线性布局管理器,而不是网格布局管理器 @Override public void onScrollStateChanged(RecyclerView recyclerView, int scrollState) { final int treeshold = 0;

我已经搜索了一段时间,但找不到一个解决方案来检测网格布局管理器的回收器视图的滚动结束。使用下面的代码实际上是可行的,但它适用于线性布局管理器,而不是网格布局管理器

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int scrollState) {
                final int treeshold = 0;
                try {
                    if (scrollState == RecyclerView.SCROLL_STATE_IDLE) {
                        if (((LinearLayoutManager) recyclerView.getLayoutManager()).findLastVisibleItemPosition() >= yourData.size()
                                - 1 - treeshold) {
                            //your load more logic
                        }
                    }
                } catch (Exception e) {
                }
            }
我的想法是,我想实现加载更多的功能到我的应用程序,所以我需要检测滚动结束


编辑:问题可能不是栅格视图本身。我使用com.tonicartos.superslim库来获取粘性头视图。我想知道这可能是问题所在

在您的回收视图中添加一个滚动侦听器,如下所示:

int pastVisiblesItems, visibleItemCount, totalItemCount;  
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                        @Override
                        public void onScrolled(RecyclerView recyclerView,
                                               int dx, int dy) {
                            super.onScrolled(recyclerView, dx, dy);
                            visibleItemCount = layoutManager.getChildCount();
                            totalItemCount = layoutManager.getItemCount();
                            pastVisiblesItems = layoutManager.findFirstVisibleItemPosition();

                           if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) {
                                //bottom of recyclerview
                          }
                        }
    });

layoutmanager是您的网格layoutmanager

我刚刚就这个问题直接向Artos先生发送了一封电子邮件,并得到了回复: “在下一个版本完成之前,它可能无法正常工作。我在我的博客“

公共抽象类EndlessRecyclerOnScrollListener Extendes RecyclerView.OnScrollListener”上写到了这一点{
public static String TAG=EndlessRecyclerOnScrollListener.class.getSimpleName();
private int previousTotal=0;//上次加载后数据集中的项目总数
private boolean load=true;//如果仍在等待加载最后一组数据,则为true。
private int visibleThreshold=5;//在加载更多内容之前,在当前滚动位置下方的最小项目数。
int firstVisibleItem、visibleItemCount、totalItemCount;
private int currentPage=1;
private RecyclerView.LayoutManager MLLayoutManager;
私有布尔值是UseLinearLayoutManager;
私有布尔值使用GridLayoutManager;
公共EndlesRecycleronScrollListener(LinearLayoutManager LinearLayoutManager){
this.mLayoutManager=linearLayoutManager;
isUseLinearLayoutManager=true;
}
public EndlessRecyclerOnScrollListener(GridLayoutManager GridLayoutManager){
this.mLayoutManager=gridLayoutManager;
isUseGridLayoutManager=true;
}
@凌驾
已填空的公共空间(RecyclerView RecyclerView、int dx、int dy){
super.onScrolled(recyclerView、dx、dy);
visibleItemCount=recyclerView.getChildCount();
totalItemCount=mLayoutManager.getItemCount();
如果(isUseLinearLayoutManager&&mLayoutManager实例为LinearLayoutManager){
firstVisibleItem=((LinearLayoutManager)mLayoutManager)。findFirstVisibleItemPosition();
}
if(isUseGridLayoutManager&&mlLayoutManager GridLayoutManager实例){
firstVisibleItem=((GridLayoutManager)mLayoutManager).findFirstVisibleItemPosition();
}
如果(装载){
如果(totalItemCount>previousTotal){
加载=假;
previousTotal=totalItemCount;
}
}
如果(!loading&&(totalItemCount-visibleItemCount)

看一看。我已经试过了,但不起作用,可能是因为我使用的粘性头库,但我还不确定。我将尝试另一种解决方法。您是否尝试过:ViewCompat.CanScrollVertical(mRecyclerView,1)在这个回答中,我直接从作者那里得到了回复。我试过了,但不起作用,可能是因为我使用的粘性头库,但我还不确定。我将尝试另一种解决方法尝试禁用粘性头库,看看它是否起作用
public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener {
    public static String TAG = EndlessRecyclerOnScrollListener.class.getSimpleName();

    private int previousTotal = 0; // The total number of items in the dataset after the last load
    private boolean loading = true; // True if we are still waiting for the last set of data to load.
    private int visibleThreshold = 5; // The minimum amount of items to have below your current scroll position before loading more.
    int firstVisibleItem, visibleItemCount, totalItemCount;

    private int currentPage = 1;

    private RecyclerView.LayoutManager mLayoutManager;
    private boolean isUseLinearLayoutManager;
    private boolean isUseGridLayoutManager;

    public EndlessRecyclerOnScrollListener(LinearLayoutManager linearLayoutManager) {
        this.mLayoutManager = linearLayoutManager;
        isUseLinearLayoutManager = true;

    }

    public EndlessRecyclerOnScrollListener(GridLayoutManager gridLayoutManager) {
        this.mLayoutManager = gridLayoutManager;
        isUseGridLayoutManager = true;

    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        visibleItemCount = recyclerView.getChildCount();
        totalItemCount = mLayoutManager.getItemCount();


        if(isUseLinearLayoutManager && mLayoutManager instanceof LinearLayoutManager){
            firstVisibleItem = ((LinearLayoutManager) mLayoutManager).findFirstVisibleItemPosition();
        }

        if(isUseGridLayoutManager && mLayoutManager instanceof GridLayoutManager){
            firstVisibleItem = ((GridLayoutManager) mLayoutManager).findFirstVisibleItemPosition();
        }

        if (loading) {
            if (totalItemCount > previousTotal) {
                loading = false;
                previousTotal = totalItemCount;
            }
        }
        if (!loading && (totalItemCount - visibleItemCount)
                <= (firstVisibleItem + visibleThreshold)) {
            // End has been reached

            // Do something
            currentPage++;

            onLoadMore(currentPage);

            loading = true;
        }
    }

    public abstract void onLoadMore(int currentPage);