数据更改后,RecyclerView无法更新用户界面

时间:2017-01-23 19:01:00

标签: android android-recyclerview

我是android开发的新手,在发出网络请求后尝试更新RecyclerView控件中的项目视图而不滚动它。据我所知,在通过onBindViewHolder事件滚动期间项目会被刷新。代码也是如此。使用notifyItemChanged方法更新用户界面,但在用户滚动之前它不起作用。

注意:favoriteMatches不是我的数据源。它是存储用户收藏夹的另一个对象列表, 在onBindViewHolder事件内我正在检查项目是否为favoriteMatches.contains(match)然后呈现为首选项目。

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);

        }
});

1 个答案:

答案 0 :(得分: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(),因为应该使用更细粒度的操作。