如何在Grid Layout recyclerview中实现无限滚动

How to implement infinite scroll in Gridlayout recylcerview

我需要有关 onscroll 方法的帮助...所以我尝试了一些我在 Whosebug 上发现的东西,但其中大部分都适用于 linearlayout 等。如果你能指出正确的方向,那将非常有帮助...... .

我正在使用 instagram api 加载图片。它一次发送 20 张图片,所以我需要在到达页面底部时加载更多图片

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
        //configViews();
//        mLayoutManager = new GridLayoutManager(this, 2);
//        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {


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



            }
        });

....
}

无限滚动的逻辑可以在适配器中。像那样:

  • Return 适配器中的大小 + 1(用于加载视图)
  • 当询问最后一个位置时,return 表示正在加载的视图
  • 运行 将下载下一个元素并更改适配器中的数据的后台任务

您也可以在显示最后一个元素之前加载下一个元素。

在OnScrolled.This中添加这个是最基本的idea.You可以根据自己的需要修改

if(dy > 0){ // only when scrolling up

    final int visibleThreshold = 2;

    GridLayoutManager layoutManager = (GridLayoutManager)recyclerview.getLayoutManager();
    int lastItem  = layoutManager.findLastCompletelyVisibleItemPosition();
    int currentTotalCount = layoutManager.getItemCount();

    if(currentTotalCount <= lastItem + visibleThreshold){
        //show your loading view 
        // load content in background

    }
}

got it right. Better way to handle infinite scrolling is in the adapter.See this answer Sabeer Mohammed。试试这个:

在适配器中创建一个这样的接口

  public interface OnLoadMoreListener {
    void onLoadMore();
}

在获取数据的activity中实现此接口并覆盖onLoadMore()。

@Override
public void onLoadMore() {
   //fetch data here
}

返回 onBindViewHolder() 中的适配器。写这个条件。

// this checks that the last item in the recyclerView has been reached
// if so, calls onLoadMore()
if ((position >= getItemCount() - 1)) {
         loadMoreListener.onLoadMore();
}

但是这个解决方案有一个问题,那就是因为recyclerView已经向下滚动,所以onBindViewHolder()中的条件将始终得到满足,直到手动向上滚动。所以 onLoadMore() 会一直被调用。此外,所有以前的数据都将丢失。

为避免将数据保存在适配器的列表中。尝试这样的事情:

public void setResultList(List<String> resultList) {
    this.resultList.addAll(resultList);
    notifyDataSetChanged();
}

这里使用 addAll() 将新列表添加到前一个列表中。这不仅会保留以前的数据,还会添加新的数据。

记得在 activity 收到新数据时调用 setResultList()。像这样的东西:(这里我使用的是 Loader)

@Override
public void onLoadFinished(Loader<String> loader, String data) {
    if (data != null) {
        someAdapter.setResultList(someModel.getResultsList());
    }
}

希望对您有所帮助!

 boolean is_loading = false;

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            setContentView(R.layout.your_layout);
            super.onCreate(savedInstanceState);

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

                    final int visibleThreshold = 2;

                    GridLayoutManager layoutManager = (GridLayoutManager) recyclerView.getLayoutManager();
                    int lastItem = layoutManager.findLastCompletelyVisibleItemPosition();
                    int currentTotalCount = layoutManager.getItemCount();

                    if (currentTotalCount <= lastItem + visibleThreshold && is_loading == false) {
                        is_loading = true;
                        //Put you code here        
                    }
                }
            });
}