Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.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 如何从AsyncTaskLoader为RecyclerView适配器提供新数据_Android_Android Recyclerview_Asynctaskloader - Fatal编程技术网

Android 如何从AsyncTaskLoader为RecyclerView适配器提供新数据

Android 如何从AsyncTaskLoader为RecyclerView适配器提供新数据,android,android-recyclerview,asynctaskloader,Android,Android Recyclerview,Asynctaskloader,我的AsyncTaskLoader正在从远程服务器加载数据。当新数据到达时,自然会调用onLoadFinished。此时,我不知道如何将新数据提供给RecyclerView.Adapter。调用notifyDataSetChanged不会给它提供新数据:它只是告诉它有新数据。那么,我该怎么做,有什么建议吗?现在我能想到的最好办法是在我的RecyclerView.Adapter实现中创建我自己的setData方法 public void setData(List<MyObject> d

我的AsyncTaskLoader正在从远程服务器加载数据。当新数据到达时,自然会调用
onLoadFinished
。此时,我不知道如何将新数据提供给
RecyclerView.Adapter
。调用notifyDataSetChanged不会给它提供新数据:它只是告诉它有新数据。那么,我该怎么做,有什么建议吗?现在我能想到的最好办法是在我的
RecyclerView.Adapter
实现中创建我自己的
setData
方法

public void setData(List<MyObject> data){
    if(null != data && !data.isEmpty()){
      synchronized(mItems){
        mItems.clear();
        mItems.addAll(data);
      }
      notifyDataSetChanged();
    }
  }
public void setData(列表数据){
if(null!=data&&!data.isEmpty()){
已同步(mItems){
明确的;
mItems.addAll(数据);
}
notifyDataSetChanged();
}
}
我的想法是最好的吗?或者有更合理的方法吗?

您有两种选择, 1.使用新数据重新实例化适配器并重置适配器。 2.你做这件事的方式


我想不出任何其他方法。

在适配器中公开一个公共方法来更新数据

例如,你可以这样说

public void updateItems(ArrayList<MyObject> myObjects) {
     this.data = myObjects;
     notifyDataSetChanged();
}
public void updateItems(ArrayList myObjects){
this.data=myObjects;
notifyDataSetChanged();
}

好的,我也遇到了同样的问题,下面是我所做的解决方案。 首先,我从onLoadFinished传递了list对象,在RecycleServiceAdapter中,我创建了方法名setCardInfo(),并在那里将该对象传递给我在适配器类中定义的全局list对象

在onLoadFinished方法中

@覆盖
public void onLoadFinished(android.content.Loader,列表){
if(地震!=null&!地震.isEmpty()){
adapter.SetCardInfo列表(地震);
adapter.notifyDataSetChanged();
}否则{
emptyView.setText(“未发现地震…”);
}
}
内部适配器类

public void setCardInfo列表(列表){
地震学家=地震;
}

我个人也喜欢这样。我将一个方法用于将数据更新到适配器中,然后调用notifyDataSetChanged。即使在BaseAdapter时代也是如此,在更改基础数据集时,我也遵循此路线,只需调用notifyDataSetChanged()。
@Override
public void onLoadFinished(android.content.Loader<List<Earthquake>> loader, List<Earthquake> earthquakes) {

    if (earthquakes != null && !earthquakes.isEmpty()) {

        adapter.setCardInfoList(earthquakes);
        adapter.notifyDataSetChanged();
    }else {
        emptyView.setText("No Earthquake Found...");
    }

}
public void setCardInfoList(List<Earthquake> earthquakes){
    this.earthquakeList = earthquakes;
}