2016-02-27 34 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()); 
    } 
} 

希望這有助於!