2016-02-27 103 views
2

我需要关于onscroll方法的帮助......所以我试过了几个我在stackoverflow上找到的东西,但是大多数都是为linearlayout工作等等。如果你能指出我会有帮助在正确的方向...如何在Gridlayout中实现无限滚动recylcerview

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



      } 
     }); 

.... 
} 

回答

2

在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 

    } 
} 
+0

这似乎是工作得很好,它可能作为一个临时工,但它似乎有点生涩。就像我一到底部一样......我真的希望能够慢慢地进行转换,而不是像代码那样......我在所有网格中获得全新的数据。 –

+0

我还有一个问题...我新与recyclerview和android一般,所以在代码中的哪一点我重新使用或回收我的意见? –

+0

另外...还有一件事...我有我的oncreate mRecyclerView =(RecyclerView)findViewById(R.id.recyclerView)顶部的这两行代码; mRecyclerView.setLayoutManager(new GridLayoutManager(this,2)); –

0

无限滚动的逻辑可以在适配器的底部加载更多。这样的:

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

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

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

但这种方法有一个问题,那是因为recyclerView已经向下滚动因此onBindViewHolder条件()总是会碰到,直到手动滚动起来。所以onLoadMore()将继续被调用。以前的所有数据也会丢失。

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

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

这里使用则addAll()到新列表添加到前一个。这不仅保留了以前的数据,而且还添加了新的数据。

记住,当新数据recived调用setResultList()在活动。事情是这样的:(这里我使用一个Loader)

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

希望这有助于!