我是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);
}
});
答案 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()
,因为应该使用更细粒度的操作。