2016-06-11 48 views
1

我在RecyclerView中通過檢查項目在onBindViewHolder()中的位置以及是否從REST服務請求了更多項目來實現無限滾動。如果物品的位置距列表末尾小於5,並且當前沒有更多物品請求,則執行更多物品的請求。如果RecyclerView通過慢慢滾動RecyclerView未顯示適配器中的所有項目

@Override 
public void onBindViewHolder(ItemHolder holder, int position) { 
    holder.bindHolder(position); 

    //debugging purposes 
    //logs the current position, the size of the item list, and whether 
    //or not more items are already being retrieved from the rest service 
    Log.d("ADAPTER", "position = " + position + 
        "\nmItems.size() = " + mItems.size() + 
        "\nGET_USER_FEED_IS_INACTIVE = " + 
        HTTPRequests.GET_USER_FEED_IS_INACTIVE + "\n\n"); 

    //query for more items if the user is less than 5 items from the end and 
    //there is not already an active query 
    if (position > mPolls.size() - 5 && HTTPRequests.GET_USER_FEED_IS_INACTIVE){ 
     HTTPRequests.GETUsersFeed(); 
    } 
} 

無限滾動工作正常,但如果我真的快速滾動到年底,查詢抓住下一批次的物品,將它們添加到列表中,但RecyclerView不會移動過去的經常項目,就好像它是列表的結尾。瘋狂的部分是,記錄清楚地表明列表大於RecyclerView使其似乎出現,但它不會顯示新項目。

以下4日誌中創建的最後4,當我滾動到RecyclerView的底部非常快:

D/ADAPTER: position = 20 
      mItems.size() = 50 
      GET_USER_FEED_IS_INACTIVE = true 

D/ADAPTER: position = 19 
      mItems.size() = 50 
      GET_USER_FEED_IS_INACTIVE = true 

D/ADAPTER: position = 23 
      mItems.size() = 50 
      GET_USER_FEED_IS_INACTIVE = true 

D/ADAPTER: position = 24 
      mItems.size() = 50 
      GET_USER_FEED_IS_INACTIVE = true 

最後的日誌顯示onBindViewHolder()在24位要求的項目 - 的最後一個項目收到第一個查詢 - 當時,mItems.size()是50 - 第二批25項已收到並添加到mItems。 但是,我不能向下滾動任何更遠的項目24.

有關爲什麼會發生這種情況的任何想法?

更新:

這是當我收到從REST服務的響應運行該代碼:

public void onResponse(String response) { 
     List<Item> usersFeed = sGson.fromJson(response, new TypeToken<ArrayList<Item>>(){}.getType()); 

     //get the size of the adapter's list before new items are added 
     int initialNumberOfItemsInAdapter = FUserFeed.sAdapter.getItemCount(); 

     //add new items to adapter's list 
     RealmSingleton.addToBottomOfUserFeedRealm(usersFeed); 

     //notify adapter of the new items 
     FUserFeed.sAdapter 
       .notifyItemRangeInserted(initialNumberOfItemsInAdapter, usersFeed.size()); 

     //signify the end of GETUserFeed activity 
     GET_USER_FEED_IS_INACTIVE = true; 
     Log.d("VOLLEY", response); 
} 

更新: 更奇怪的行爲 - 當我瀏覽到另一個片段,然後回到用戶提要片段,RecyclerView現在認識到列表中有更多項目,所以無限滾動開始再次正常運行。但是如果我再次快速向下滾動,bug最終會重新出現,而且我必須導航到另一個片段並從另一個片段中再次運行。

+0

你試過'notifyDataSetChanged'而不是'插入'嗎?以防萬一 –

+0

@StasLelyuk不,但我解決了這個問題。我不知道我是否找出問題的原因,但無限滾動正在工作。看看我的答案 –

回答

0

這似乎是問題RealmSingleton.addToBottomOfUserFeedRealm(usersFeed)被添加Item s到我的適配器的RealmResults名單異步 - 的Realm一個功能 - 和我後馬上打電話FUserFeed.sAdapter.notifyItemRangeInserted()。所以,我通知適配器在插入新項目之前插入了新項目。

所以我所做的是addChangeListener(RealmChangeListener)mItems並在其中調用notifyItemRangeInserted()以確保它只在mItems發生變化後才被調用。

現在它的工作完美;不管我向下滾動多快。

雖然爲什麼它在我慢慢滾動時起作用,這仍然很奇怪。滾動速度並不影響在該Realm異步添加了項目的mItems,所以notifyItemRangeInserted()應該一直前的項目實際上添加到列表稱爲速度。然而,如果我足夠慢地滾動,實施仍然有效。

相關問題