【问题标题】:NotifyDataSetChanged RecyclerView not working at allNotifyDataSetChanged RecyclerView 根本不工作
【发布时间】:2023-03-10 05:57:01
【问题描述】:

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

我在使用这种技术时遇到了两个问题:

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

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

    @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);
    
        }
    }
    

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

【问题讨论】:

  • 我有更好的办法。只需将新数据添加到 Adapter class 中的旧列表并从中调用 notifyDataSetChanged();
  • 我也这样做了。我们在列表视图中所做的相同。你用过回收站视图吗?
  • 如果您希望我们解决问题,请显示问题,而不是解决方法
  • 是的,回收站视图也是如此
  • 我有一个数组列表,每次我搜索列表时都有新数据。所以它根本没有更新。

标签: android android-recyclerview notifydatasetchanged


【解决方案1】:

问题在于您的更新功能。每次更新时,您都会用新实例覆盖 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();
        }
    }

【讨论】:

  • @Gaurav 为什么要将 bookMagDataList 保存在 Fragment 中?你的适配器是内部类吗?
  • @ankitagrawal 也许托管片段的活动对了解片段的实现不感兴趣?这将最大限度地提高活动的可重用性。
  • @styx 我说的不是活动,而是片段和适配器,理想情况下片段不应该有数据,但适配器应该有
  • @ankitagrawal 理想情况下是的。 read/update/insert/delete 的实现也应该封装在适配器中。由于我认为糟糕的设计?
  • 我猜他如何实施,他解决了他的问题,所以不用担心
【解决方案2】:

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

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

styx 给出了答案,所以归功于他

【讨论】:

  • 当您可以使用 bookMagDataList.addAll() 函数在原始列表中添加更新值时,为什么要用新实例覆盖它?提醒:原始列表位于片段中,适配器仅保留对其的引用。
  • 我是否用新实例覆盖它,我只是重复使用相同的适配器,请参阅代码
  • 此外,我们不知道他是否在适配器中保留引用,因为他没有发布适配器代码,而且你假设我们不知道它
  • @ankitagrawal:如果他没有发布适配器代码,那么我们应该让他发布
  • 如果适配器不保留列表的引用,那么适配器应该如何显示数据?
【解决方案3】:

我的解决方案如下

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

【讨论】:

    【解决方案4】:

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

    喜欢--

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

    【讨论】:

      【解决方案5】:

      您必须在update 方法中执行以下操作,

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-27
        • 1970-01-01
        相关资源
        最近更新 更多