我在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最終會重新出現,而且我必須導航到另一個片段並從另一個片段中再次運行。
你試過'notifyDataSetChanged'而不是'插入'嗎?以防萬一 –
@StasLelyuk不,但我解決了這個問題。我不知道我是否找出問題的原因,但無限滾動正在工作。看看我的答案 –