Java 如何将notifyDataSetChanged()与包含listview片段的viewpager一起使用
我有一个带碎纸机的寻呼机。每个页面加载一个包含ListView的片段。此ListView加载许多TextView,这些TextView从静态ArrayList获取文本。此静态ArrayList在AsyncTask中使用来自服务器的数据进行更新。每次更新ArrayList时,我都要更新ListView。如果我在ViewPager适配器上使用notifyDataSetChanged(),则它不起作用,我必须访问每个ListViewadapter。有什么建议吗 这是我的AsyncTask doinBackground方法:Java 如何将notifyDataSetChanged()与包含listview片段的viewpager一起使用,java,android,listview,android-fragments,android-listview,Java,Android,Listview,Android Fragments,Android Listview,我有一个带碎纸机的寻呼机。每个页面加载一个包含ListView的片段。此ListView加载许多TextView,这些TextView从静态ArrayList获取文本。此静态ArrayList在AsyncTask中使用来自服务器的数据进行更新。每次更新ArrayList时,我都要更新ListView。如果我在ViewPager适配器上使用notifyDataSetChanged(),则它不起作用,我必须访问每个ListViewadapter。有什么建议吗 这是我的AsyncTask doinBa
protected Object doInBackground(Object[] params) {
if(socket!=null){
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
while(true){
try {
s = in.readLine();
} catch (IOException e) {
e.printStackTrace();
}
Type type = new TypeToken<ArrayList<VirtualSensor>>(){}.getType();
Gson gson = new Gson();
_sensorComponents =(ArrayList<VirtualSensor>) gson.fromJson(s, type);
Log.d("Mesage", _sensorComponents.get(1).get_value()+"");
runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.notifyDataSetChanged();
}
});
}
}
return null;
}
受保护对象doInBackground(对象[]参数){
if(套接字!=null){
试一试{
in=新的BufferedReader(新的InputStreamReader(socket.getInputStream());
}捕获(IOE异常){
e、 printStackTrace();
}
while(true){
试一试{
s=in.readLine();
}捕获(IOE异常){
e、 printStackTrace();
}
Type Type=new-TypeToken(){}.getType();
Gson Gson=新的Gson();
_sensorComponents=(ArrayList)gson.fromJson(s,type);
Log.d(“Mesage”,_sensorComponents.get(1.get_value()+);
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
adapter.notifyDataSetChanged();
}
});
}
}
返回null;
}
更新:经过一些测试,我发现当我在viewpager中有超过1个页面时,问题就出现了。我使用FragmentStatePagerAdapter
每次更新arraylist时,我都要更新listview
<>我会考虑使用观察者模式,这会使代码更干净。然后,每个片段都将注册其侦听器,一旦数据集被更新(通过异步TAK或任何其他方式),您就可以广播关于它的事件,然后片段可以对它执行它们想要的操作。您可以使用事件总线,如GreenRobot的EventBus或OTTO,以节省一些时间。使用
EventBus
是更好的解决方案
也试试这个
不要将数据分配给ArrayList
,而是尝试向其中添加内容
换行
_sensorComponents =(ArrayList<VirtualSensor>) gson.fromJson(s, type);
\u sensorComponents=(ArrayList)gson.fromJson(s,type);
到
\u传感器组件。清除();
_add((ArrayList)gson.fromJson(s,type));
然后通过调用
adapter.notifyDataSetChanged()通知您的数据集代码>经过一些测试,我发现当我在viewpager中有超过1个页面时会出现问题。我使用FragmentStatePagerAdapter。如果您不介意,可以发布一些代码。所以我们可以找到问题所在???。为什么在代码中使用了一段时间(真的)?好的,我从来没有听说过,但我会读到它。谢谢。这是一个很好的例子来说明它是如何工作的?是的,这很好。您还可以检查文档,使大部分作业已经在该库中实现,所以您所能做的就是创建偶数类,注册侦听器,并在需要时广播事件
_sensorComponents.clear();
_sensorComponents.add((ArrayList<VirtualSensor>) gson.fromJson(s, type));