NotifyDataSetChanged RecyclerView 根本不工作

NotifyDataSetChanged RecyclerView not working at all

我正在使用 RecyclerView 来显示从 Web 服务解析后检索到的数据。问题是 notifydatasetchanged 根本不起作用。为了解决这个问题,我再次设置适配器。

我在使用此技术时遇到两个问题:

  1. 再次设置新适配器时屏幕闪烁。

  2. 回收站视图也指向回收站视图的第一项。 (我只想在现有 list.Array 列表大小更新的末尾追加新数据。但唯一的问题是,列表是从第零位置开始的。)

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_book_mag_list_child, container, false);
        recyclerView = (RecyclerView) view.findViewById(R.id.bookMagRecyclerViewList);
        bookMagDataList = new ArrayList<>();
        adapter = new BookMagListRecyclerViewAdapter(getActivity(), bookMagDataList);
        recyclerView.setAdapter(adapter);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
        //linearLayoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setOnScrollListener(new EndlessRecyclerScrollListener(linearLayoutManager) {
            @Override
            public void onLoadMore(int current_page) {
                Log.d("Do Something", "Do Something" + current_page);
                params.setStart("" + current_page);
                dataModel.init(params);
            }
        });
        return view;
    }
    
    
    
    
    @Override
    public void update() {
        if (dataModel.getFragmentData(subScreenId) != null) {
            bookMagDataList = dataModel.getFragmentData(subScreenId);
            Log.d("MyDataListSize: ", "" + bookMagDataList.size());
            adapter = new BookMagListRecyclerViewAdapter(getActivity(), bookMagDataList);
            recyclerView.setAdapter(adapter);
    
        }
    }
    

请检查问题是什么,如果可以解决请告诉我。

你必须像下面的 update 方法那样做,

if(adapter == null){
    adapter = new BookMagListRecyclerViewAdapter(getActivity(), bookMagDataList);
    recyclerView.setAdapter(adapter);
}else{
    myAdapter.notifyDataSetChanged();
}

问题出在您的更新功能上。每次更新时,您都会用新实例覆盖 bookMagDataList 列表。您应该使用 .addAll() 函数来添加新元素。然后调用 adapter.notifyDataSetChanged() 。进行如下更改。

 @Override
    public void update() {
        if (dataModel.getFragmentData(subScreenId) != null) {
            bookMagDataList.addAll(dataModel.getFragmentData(subScreenId));
            Log.d("MyDataListSize: ", "" + bookMagDataList.size());
            adapter.notifyDataSetChanged();
        }
    }

由于您没有发布您的适配器代码,您必须使用 styx 方法:

@Override
public void update() {
    if (dataModel.getFragmentData(subScreenId) != null) {
        bookMagDataList.addAll(dataModel.getFragmentData(subScreenId));
        Log.d("MyDataListSize: ", "" + bookMagDataList.size());
        adapter.notifyDataSetChanged();
    }
}

答案由 styx 给出,因此归功于他

不要再次实例化适配器,只需要在 arrayList 中添加新数据然后调用 notifyDatasetChanged()

喜欢--

bookMagDataList.add("YOUR ITEM");
adpter.notifyDatasetChanged();

我的解决方案如下

if (adapter == null) {
    adapter = new BookMagListRecyclerViewAdapter(getActivity(), bookMagDataList);
    recyclerView.setAdapter(adapter);
  } else {
    adapter.bookMagDataList.clear();
    adapter.bookMagDataList = bookMagDataList;
    myAdapter.notifyDataSetChanged()
  }