Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android NotifyDataSetChanged RecyclerView根本不工作_Android_Android Recyclerview_Notifydatasetchanged - Fatal编程技术网

Android NotifyDataSetChanged RecyclerView根本不工作

Android NotifyDataSetChanged RecyclerView根本不工作,android,android-recyclerview,notifydatasetchanged,Android,Android Recyclerview,Notifydatasetchanged,我使用RecyclerView显示从web服务解析后检索的数据。问题是notifydatasetchanged根本不起作用。为了解决这个问题,我再次设置了适配器 使用此技术时,我遇到两个问题: 再次设置新适配器时出现屏幕闪烁 此外,recycler视图指向recycler视图的第一项。(我只想将新数据附加到现有列表的末尾。数组列表大小正在更新。但唯一的问题是,列表是从第0个位置开始的。) @覆盖 创建视图上的公共视图(布局、充气机、视图组容器、, Bundle savedInstanceStat

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

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

  • 再次设置新适配器时出现屏幕闪烁

  • 此外,recycler视图指向recycler视图的第一项。(我只想将新数据附加到现有列表的末尾。数组列表大小正在更新。但唯一的问题是,列表是从第0个位置开始的。)

    @覆盖
    创建视图上的公共视图(布局、充气机、视图组容器、,
    Bundle savedInstanceState){
    视图=充气机。充气(R.layout.fragment\u book\u mag\u list\u child,container,false);
    recyclerView=(recyclerView)view.findViewById(R.id.bookMagRecyclerViewList);
    bookMagDataList=newarraylist();
    adapter=new BookMagListRecycleServiceAdapter(getActivity(),bookMagDataList);
    recyclerView.setAdapter(适配器);
    LinearLayoutManager LinearLayoutManager=新的LinearLayoutManager(getActivity());
    //linearLayoutManager.setStackFromEnd(true);
    recyclerView.setLayoutManager(linearLayoutManager);
    setOnScrollListener(新EndlessRecyclerScrollListener(linearLayoutManager){
    @凌驾
    public void onLoadMore(int当前页面){
    Log.d(“做点什么”,“做点什么”+当前页面);
    参数设置开始(“+当前页面);
    dataModel.init(params);
    }
    });
    返回视图;
    }
    @凌驾
    公共无效更新(){
    if(dataModel.getFragmentData(subscreind)!=null){
    bookMagDataList=dataModel.getFragmentData(subscreind);
    Log.d(“MyDataListSize:,”“+bookMagDataList.size());
    adapter=new BookMagListRecycleServiceAdapter(getActivity(),bookMagDataList);
    recyclerView.setAdapter(适配器);
    }
    }
    

  • 请检查问题是什么,并告诉我是否可以解决。

    您必须按照下面的
    更新方法执行操作

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

    问题出在更新函数中。每次更新时,您都将使用新实例覆盖bookMagDataList列表。您应该使用use.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()

    像--

    我的解决方案如下

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

    我有更好的办法。只需将新数据添加到
    适配器类中的旧列表中,然后调用
    notifyDataSetChanged()从那以后。我也做了同样的事情。与我们在listview中所做的相同。你是否使用过recycler视图?如果你想让我们解决问题,请显示问题,而不是解决方法。你使用recycler视图也可以这样做。我有一个arraylist,它在每次查询列表时都有新数据。所以它根本没有更新。当您可以使用bookMagDataList.addAll()函数将更新后的值添加到原始列表中时,为什么要用新实例覆盖它?提醒:原始列表位于适配器仅保留其引用的片段中。我是否使用新实例覆盖它,我只是重复使用相同的适配器,请进一步查看代码,我们不知道他是否在适配器中保留引用,因为他没有发布适配器代码,而且你假设我们不知道it@ankitagrawal:如果他没有发布适配器代码,那么我们应该让他发布如果适配器没有保留列表的引用,那么适配器应该如何显示列表数据?@Gaurav你为什么把bookMagDataList保存在碎片中?您的适配器是内部类吗?@ankitagrawal可能承载片段的活动对了解片段的实现不感兴趣?这将最大限度地提高活动的可重用性。@styx我说的不是活动,而是片段和适配器,理想情况下片段不应该有数据,但适配器应该有数据have@ankitagrawal理想情况下是的。读/更新/插入/删除的实现也应该封装在适配器中。我猜是因为糟糕的设计?我猜他应该如何实现,他解决了他的问题,所以不必担心
    
    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()
      }