如何将 notifyDataSetChanged() 与包含带有列表视图的片段的 viewpager 一起使用

How to use notifyDataSetChanged() with a viewpager which contains a fragment with a listview

我有一个带有 FragmentStatePagerAdapter 的 ViewPager。每个页面加载一个包含 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;

    }

更新:经过一些测试,我发现当我在 viewpager 中有超过 1 个页面时会出现问题。我使用 FragmentStatePagerAdapter。

Well, i want to update the listview, each time the arraylist is updated.

我会考虑使用观察者模式,这将使您的代码更清晰。然后每个片段都会注册它的监听器,一旦你的数据集被更新(通过异步任务或任何其他方式),你就会广播关于它的事件,然后片段可以用它做他们想做的事。您可以使用 GreenRobot 的 EventBus 或 OTTO 等事件总线来节省时间。

使用EventBus 是更好的解决方案。

也试试这个。

与其将数据分配给您的 ArrayList,不如尝试向其中添加内容。

更改此行

 _sensorComponents =(ArrayList<VirtualSensor>) gson.fromJson(s, type);

 _sensorComponents.clear();
 _sensorComponents.add((ArrayList<VirtualSensor>) gson.fromJson(s, type));

然后通过调用 adapter.notifyDataSetChanged();

通知您的数据集

经过一些测试,我发现当我在 viewpager 中有超过 1 个页面时会出现问题。我使用 FragmentStatePagerAdapter.