How to refresh a ListView from a BroadcastReceiver?

和自甴很熟 提交于 2020-01-13 12:52:17

问题


If I call notifyDataSetChanged() on the custom adapter associated to my ListView, all the views should refresh themself (getView() will be called). Now I have a BroadcastReceiver that is listening to an event. When the event fires, the ListView must be refreshed. How can I achieve this? Thanks!


回答1:


If you refresh listview from receiver you'll have code like this:

BroadcastReceiver br;
public final static String BROADCAST_ACTION = "BROADCAST_ACTION";
br = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
//code refreshing...
}
};
IntentFilter intFilt = new IntentFilter(BROADCAST_ACTION);
registerReceiver(br, intFilt);

And you call it with code:

Intent intent = new Intent(BROADCAST_ACTION);
sendBroadcast(intent);

If you need the refresh to be another action you just need to add (after action):

Intent intent = new Intent(BROADCAST_ACTION);
sendBroadcast(intent);



回答2:


As requested, please see the sample code below:

public interface OnDataUpdateListener {
    void onDataAvailable(ArrayList<String> newDataList);
}

public class MyTestReceiver extends BroadcastReceiver {
    public static final String DATA_LIST = "DATA_LIST";
    private OnDataUpdateListener mDataUpdateListener = null;
    public MyTestReceiver(OnDataUpdateListener dataUpdateListener) {
        mDataUpdateListener = dataUpdateListener;
    }

    @Override
    public void onReceive(Context ctx, Intent intent) {
        // assuming data is available in the delivered intent
        ArrayList<String> dataList = intent.getSerializableExtra(DATA_LIST);
        if (null != mDataUpdateListener) {
            mDataUpdateListener.onDataAvailable(dataList);
        }
    }
}

public class MyActivity extends FragmentActivity implements OnDataUpdateListener {
    public static final String ACTION_DATA_UPDATE_READY = "ACTION_DATA_UPDATE_READY";
    private MyTestReceiver mTestReceiver = null;
    private <SomeAdapterClass> mAdapter = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // other required initialization 
        mTestReceiver = new MyTestReceiver(this);
    }

    @Override
    public void onResume() {
        super.onResume();
        if (null != mTestReceiver) {
            registerReceiver(mTestReceiver, new IntentFilter(ACTION_DATA_UPDATE_READY));
        }
    }

    void onDataAvailable(ArrayList<String> newDataList) {
        // assuming you want to replace existing data and not willing to append to existing dataset
        mAdapter.clear();
        mAdapter.addAll(newDataList);
        mAdapter.notifyDataSetChanged();
    }
}



回答3:


In the code where your data is updated, fire off a message signalling that data has been changed... (You will need access to either the Activity or the Application context to do this)

Intent intent = new Intent("ListViewDataUpdated");
LocalBroadcastManager.getInstance(context.sendBroadcast(intent));

Then just catch the catch the message using the following code in your activity, and tell your ListAdapter to update...

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
          @Override
          public void onReceive(Context context, Intent intent) {
            myListAdapter.notifyDataSetChanged();
           }
        };

@Override
public void onResume(){
  super.onResume();
  LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("ListViewDataUpdated"));
  myListAdapter.notifyDataSetChanged();//in case our data was updated while this activity was paused
}


@Override
protected void onPause() {
   LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
   super.onPause();
}

Credit: adapted from Vogella



来源:https://stackoverflow.com/questions/26163075/how-to-refresh-a-listview-from-a-broadcastreceiver

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!