定期更新列表视图

时间:2016-09-01 04:33:30

标签: java android listview

我目前有一个List View,它会从ArrayList中获取MainActivity中每隔一定时间更新的数据。我想每隔一定时间更新列表视图,比方说2秒。问题是我在片段上有这个适配器,如果我从适配器调用notifyDataSetChanged();,如果我在MainActivityfragment之间切换,则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()是否安全?

1 个答案:

答案 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);