Recyclerview未更新数据集,仍显示旧值



RecyclerView适配器更新方法

public void updateList(List<Album> updatedList) {
albums.clear();
albums = new ArrayList<>(updatedList);
for (int i = 0 ; i < albums.size(); i++) {
Log.d(TAG, "updatedList values: " + albums.get(i).getAlbumName());
}
notifyDataSetChanged();
}

在我将更新的列表传递给适配器中的此方法并调用notifyDatasetChanged()之后,更新的值将显示在logcat中。

Logcat输出显示正确的更新值

AlbumAdapter: onBindViewHolder albumsList: 1967-1970 Disc 1
AlbumAdapter: onBindViewHolder albumsList: 1967-1970 Disc 1 
AlbumAdapter: onBindViewHolder albumsList: 1967-1970 Disc 1 
AlbumAdapter: onBindViewHolder albumsList: 1967-1970 Disc 1 

在我切换回这个片段之后,Recyclerview出于某种原因仍然显示旧值。

切换回后的Logcat输出

AlbumAdapter: onBindViewHolder albumsList: 1967-1970 Disc 2
AlbumAdapter: onBindViewHolder albumsList: 1967-1970 Disc 2
AlbumAdapter: onBindViewHolder albumsList: 1967-1970 Disc 2
AlbumAdapter: onBindViewHolder albumsList: 1967-1970 Disc 2

我甚至检查了updateList方法中的值,结果显示1967-1970光盘1

我还试过什么

public void updateList(List<Album> updatedList) {
albums = updatedList;
notifyDataSetChanged();
} 

但仍然存在同样的问题。

编辑

我注意到只有当我有很多物品时才会发生这种情况。

如果我只有10个项目,它可以正常工作,没有任何问题,但当我尝试超过400个项目时,它不会更新值。

Recyclerview

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_albums, container,false);
recyclerViewAlbums = rootView.findViewById(R.id.recyclerViewAlbums);
if (getActivity() != null) {
List<Album> albums = SongsLibrary.getInstance().getAlbums();
if (!albums.isEmpty()){
albumAdapter = new AlbumAdapter(getActivity(), albums, this, this);
int noOfColumns = Utilities.calculateNoOfColumns(getActivity());
final GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), noOfColumns);
recyclerViewAlbums.setLayoutManager(gridLayoutManager);
recyclerViewAlbums.setHasFixedSize(true);
//recyclerViewAlbums.setItemViewCacheSize(20);
recyclerViewAlbums.setDrawingCacheEnabled(true);
recyclerViewAlbums.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
recyclerViewAlbums.setAdapter(albumAdapter);
isInitRecyclerView = true;
Log.i(TAG, "Albums loaded!");
}else{
isInitRecyclerView = false;
Log.e(TAG, "No Albums found!");
}
}
Log.i(TAG, "onCreateView called!");
return rootView;
}

我找到了问题的原因。

显然,我的ValueFilter用旧值覆盖了我传递给updateList方法的新数据集。

这是我的SearchView的ValueFilter

private class ValueFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String str = constraint.toString().toUpperCase();
Log.e("constraint", str);
FilterResults results = new FilterResults();
if (constraint.length() > 0) {
List<Album> filterList = new ArrayList<>();
for (int i = 0; i < albumsTemp.size(); i++) {
if ((albumsTemp.get(i).getAlbumName().toUpperCase())
.contains(constraint.toString().toUpperCase())) {
Album album = albumsTemp.get(i);
filterList.add(album);
}
}
results.count = filterList.size();
results.values = filterList;
} else {
results.count = albumsTemp.size();
results.values = albumsTemp;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
//albums = (List<Album>) results.values;
notifyDataSetChanged();
}
}

publishResults中评论//albums = (List<Album>) results.values;后,它解决了我的问题。

最新更新