我目前有一个List View
,它会从ArrayList
中获取MainActivity
中每隔一定时间更新的数据。我想每隔一定时间更新列表视图,比方说2秒。问题是我在片段上有这个适配器,如果我从适配器调用notifyDataSetChanged();
,如果我在MainActivity
和fragment
之间切换,则View只会更新。我希望这个List视图每2秒刷新一次,而我在View中有片段。我试图在Adapter类上运行TimerTask
,但我得到一个例外:
android.view.ViewRootImpl $ CalledFromWrongThreadException:只有 创建视图层次结构的原始线程可以触及其视图。
我猜你只能从附加了片段的MainActivity更新视图。
这是我如何运行计时器:
public void setTimer(int seconds) {
timer = new Timer();
timer.schedule(new RemindTask(), seconds * 1000);
}
public class RemindTask extends TimerTask {
//Refreshing list view
public void run() {
notifyDataSetChanged();
timer.cancel();
setTimer(2);
}
}
在MainActivity上创建适配器实例并在每隔一定时间内调用notifyDataSetChanged()
是否安全?
答案 0 :(得分:2)
您可以在Fragment中创建一个广播接收器。有一定的行动名称。 让我们说“refresh_data”。 然后从MainActivity发送此广播。 示例代码。
public class MyFragment extends Fragment{
private BroadcastReceiver refreshData = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
myAdapter.notifyDataSetChanged();
}
};
@Override
public void onResume() {
super.onResume();
LocalBroadcastManager.getInstance(getContext()).registerReceiver(refreshData,
new IntentFilter("refresh_Data"));
}
@Override
public void onPause() {
LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(refreshData);
super.onPause();
}
}
在更新列表时,在Activity调用跟随方法
Intent intent = new Intent("refresh_data");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);