我有一个带有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。
答案 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。