Java 如何将notifyDataSetChanged()与包含listview片段的viewpager一起使用

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

我有一个带碎纸机的寻呼机。每个页面加载一个包含ListView的片段。此ListView加载许多TextView,这些TextView从静态ArrayList获取文本。此静态ArrayList在AsyncTask中使用来自服务器的数据进行更新。每次更新ArrayList时,我都要更新ListView。如果我在ViewPager适配器上使用notifyDataSetChanged(),则它不起作用,我必须访问每个ListViewadapter。有什么建议吗

这是我的AsyncTask doinBackground方法:

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