如何将notifyDataSetChanged()与viewpager一起使用,该viewpager包含一个带有listview的片段

时间:2015-08-05 13:58:16

标签: java android listview android-fragments android-listview

我有一个带有FragmentStatePagerAdapter的ViewPager。每个页面加载一个包含ListView的片段。此ListView加载许多TextViews,它从静态ArrayList获取文本。此静态ArrayList在AsyncTask中使用来自服务器的数据进行更新。好吧,我想每次更新ArrayList时更新ListView。如果我在ViewPager adaptar上使用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。

3 个答案:

答案 0 :(得分:1)

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

也试试这个。

不要将数据分配给ArrayList,而是尝试向其中添加内容。

更改此行

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

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

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

通知您的数据集

答案 1 :(得分:0)

  

好吧,我希望每次更新arraylist时都更新listview。

我会考虑使用Observer Pattern,它会让你的代码更清晰。然后,每个片段都会注册其监听器,一旦您的数据集被更新(通过异步播放或通过任何其他方式),您就可以广播关于它的事件,然后片段可以根据需要进行操作。您可以使用GreenRobot的EventBus或OTTO等活动公共汽车为您节省一些时间。

答案 2 :(得分:0)

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