2017-04-16 28 views
0

我有一個RecyclerView,我希望它是從頂部拉的SwipeRefreshLayout,所以我可以得到最新的20個項目,並顯示在RecyclerView.At同時,當到達第20項在底部,然後再取20來自數據庫的項目。用於頂部和底部的RecycleView的SwipeRefreshLayout?

因此,我得到如下的最後一項,所以我可以獲取下一個第20項。

//for endless scroll 
    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 

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

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

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

       Log.i("Yaeye!", "end called"); 
       fetchPost(feedItems.get(feedItems.size()-1).getId()); 
       //This function is fetch the next 20th item from database 




       // Do something 

       loading = true; 
      } 
     } 
    }); 

} 

這是正常的,當它到達Recycleview的底部,但問題是當現在的頂部(在RecyclerView第1項),我拉下來,想它獲取新的項目,但它墜毀。這是錯誤:

java.lang.ArrayIndexOutOfBoundsException: length=27; index=-1

這裏是我的代碼:SwipeRefreshLayout在數據庫

// show loader and fetch messages 
    swipeRefreshLayout.post(
      new Runnable() { 
       @Override 
       public void run() { 
        clear(); 
        fetchIntialPost(); // this one,fetch the latest item 
       } 
      } 
    ); 

因此獲取最新的20項我知道它造成的,當它在第一個項目時,它也考慮RecyclerView的結束,所以它調用fetchPost(feedItems.get(feedItems.size()-1).getId());這個函數而不是這個函數fetchIntialPost();

所以現在我的問題是,當在頂部(第一項) ,請撥打fetchIntialPost();,將SwipeRefreshLayout拉低?最後一項,請撥打fetchPost(feedItems.get(feedItems.size()-1).getId());

謝謝

回答

1

我解決它通過檢查feedItems.size()-1前值執行這行代碼fetchPost(feedItems.get(feedItems.size()-1).getId());

這是我工作的代碼:

//top and bottom also consider end of the list 
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 

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

      visibleItemCount = recyclerView.getChildCount(); 
      totalItemCount = mLayoutManager.getItemCount(); 
      firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition(); 
      lastVisibleItem = mLayoutManager.findLastVisibleItemPosition(); 

      if (loading) { 
       if (totalItemCount > previousTotal) { 
        loading = false; 
        previousTotal = totalItemCount; 
       } 
      } 
      if (!loading && (totalItemCount - visibleItemCount) 
        <= (firstVisibleItem + visibleThreshold)) { 
       // End has been reached 
       //top and bottom also consider end of the list 
       Log.i("Yaeye!", "end called"); 
       if(feedItems.size() - 1 > 0) { 
        //when pull down SwipeRefreshLayout,feedItems.size = -1 
        //so if greater than 0,means is bottom of the list 
        // Do something 
        fetchPost(feedItems.get(feedItems.size() - 1).getId()); 

        loading = true; 
       }else{ 
        //here is the top of the list 
       } 
      } 

     } 

    }); 
0

你能試試嗎?

lastVisibleItem = mLayoutManager.findLastVisibleItemPosition(); 

if (!loading && lastVisibleItem == (totalItemCount - 1)) { 
    // End has been reached 
} 
+0

這個人是不是崩潰,而是在底部時它不能調用'fetchPost(feedItems.get(feedItems.size() - 1).getId());'只是沒有調用這個函數 – ken

+0

當底部達到時,你能否觀察加載,lastVisibleItem和totalItemCount的值? – CodeCameo

+0

我'log.d'出來,當第一個項目我拉下來,沒有值出來,崩潰,當我在底部,它繼續加載.. – ken