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

时间:2020-09-25 04:37:25

标签: java android android-recyclerview

RecyclerView Adapter更新方法

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输出显示正确的更新值

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 Disc 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;
    }

1 个答案:

答案 0 :(得分:0)

我找到了问题的原因。

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