2017-01-23 56 views
0

我是Android開發中的新成員,發出網絡請求後嘗試更新RecyclerView控件中的項目視圖而不滾動它。據我所知,項目在滾動期間通過onBindViewHolder事件刷新。有代碼。使用notifyItemChanged方法來更新UI,但在用戶滾動之前它不起作用。RecyclerView不更新數據更改後的用戶界面

注意:favoriteMatches不是我的數據來源。這是另一個存儲用戶收藏夾的對象列表, 在onBindViewHolder裏面,如果項目是favoriteMatches.contains(match),那麼我將會討論這個事件,然後渲染爲fav項目。

call.enqueue(new Callback<AddRemoveFavoriteRequest.Response>() { 
     @Override 
     public void onResponse(Call<AddRemoveFavoriteRequest.Response> call, Response<AddRemoveFavoriteRequest.Response> response) { 
      AddRemoveFavoriteRequest.Response body = response.body(); 
      Utilities.dismissProgressDialog(getActivity(),progressBar); 

      if(body.error == null){ 
       if(add){ 
        favoriteMatches.add(matchId); 
       } 
       else { 
        favoriteMatches.remove(matchId); 
       } 

       adapter.notifyItemChanged(absolutePosition); 
       Preferences.getDefaultPreferences().edit() 
         .putStringSet(Preferences.PREF_FAVORITES,favoriteMatches) 
         .apply(); 

      }else{ 
       Utilities.showSnackBar(getActivity(),recyclerView,body.error); 
      } 
     } 

     @Override 
     public void onFailure(Call<AddRemoveFavoriteRequest.Response> call, Throwable t) { 
      t.printStackTrace(); 
      Utilities.dismissProgressDialog(getActivity(),progressBar); 

     } 
}); 
+0

什麼是'absolutePosition'? –

+0

嘗試使用'adapter.notifyDataSetChanged()',如果這不起作用,那麼你的問題就出現在你的數據中。如果有效,那麼檢查'absolutePosition'是否正確。 –

回答

1

notifyItemChanged取得該項目改變的位置。

您正在添加和移除元素,以便位置移動。相反,您可以單獨通知職位。

int changedPosition = 0; 
if(add){ 
    changedPosition = favoritesMatches.size(); 
    favoriteMatches.add(matchId); 
    adapter.notifyItemInserted(changedPosition); 
} 
else { 
    changedPosition = favoriteMatches.indexOf(matchId); // might not work 
    favoriteMatches.remove(matchId); 
    adapter.notifyItemRemoved(changedPosition); 
} 

或者,而不是更新整個列表

adapter.notifyDataSetChanged(); 

瞭解更多關於notifying the adapter,但要注意

一個RecyclerView適配器不應該依賴notifyDataSetChanged()因爲更細粒度的操作應使用。

相關問題