如何将 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.
我有一个带有 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.