如何在Gridlayout recylcerview中实现无限滚动

时间:2016-02-27 18:41:38

标签: android gridview android-recyclerview

我需要onscroll方法的帮助......所以我尝试了一些我在stackoverflow上找到的东西,但是大多数都适用于linearlayout等。如果你能指出我正确的方向,那将是非常有用的...... / p>

我使用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);



            }
        });

....
}

4 个答案:

答案 0 :(得分:6)

在OnScrolled中添加。这是基本的想法。您可以根据您的要求修改它

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

    }
}

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

Kevin Robatel做对了。处理无限滚动的更好方法是在适配器中。参见这个答案Sabeer Mohammed。试试这个:

在适配器中创建一个接口

  public interface OnLoadMoreListener {
    void onLoadMore();
}

在获取数据的活动中实现此接口并覆盖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();
}

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

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

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

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

请记住在接收新数据时在活动中调用setResultList()。这样的事情:(我在这里使用装载机)

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

希望这有帮助!

答案 3 :(得分:0)

 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        
                    }
                }
            });
}