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;
后,它解决了我的问题。