Android 如何从BroadcastReceiver刷新ListView?

Android 如何从BroadcastReceiver刷新ListView?,android,listview,broadcastreceiver,notifydatasetchanged,Android,Listview,Broadcastreceiver,Notifydatasetchanged,如果我在与我的ListView关联的自定义适配器上调用notifyDataSetChanged(),所有视图都应该自己刷新(getView()将被调用)。 现在我有一个正在收听事件的广播接收器。触发事件时,必须刷新ListView。我怎样才能做到这一点? 谢谢 如果从receiver刷新listview,您将得到如下代码: BroadcastReceiver br; public final static String BROADCAST_ACTION = "BROADCAST_ACTION";

如果我在与我的ListView关联的自定义适配器上调用
notifyDataSetChanged()
,所有视图都应该自己刷新(
getView()
将被调用)。
现在我有一个正在收听事件的广播接收器。触发事件时,必须刷新ListView。我怎样才能做到这一点?
谢谢

如果从receiver刷新listview,您将得到如下代码:

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);
你用代码来称呼它:

Intent intent = new Intent(BROADCAST_ACTION);
sendBroadcast(intent);
如果需要将刷新作为另一个操作,则只需添加(操作后):


根据要求,请参见下面的示例代码:

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();
    }
}
公共接口OnDataUpdateListener{ void onDataAvailable(ArrayList newDataList); } 公共类MyTestReceiver扩展了BroadcastReceiver{ 公共静态最终字符串DATA\u LIST=“DATA\u LIST”; 私有OnDataUpdateListener mDataUpdateListener=null; 公共MyTestReceiver(OnDataUpdateListener dataUpdateListener){ mDataUpdateListener=dataUpdateListener; } @凌驾 公共void onReceive(上下文ctx、意图){ //假设数据在交付意图中可用 ArrayList dataList=intent.getSerializableExtra(数据列表); if(null!=mDataUpdateListener){ mDataUpdateListener.onDataAvailable(数据列表); } } } 公共类MyActivity扩展FragmentActivity实现OnDataUpdateListener{ 公共静态最终字符串ACTION\u DATA\u UPDATE\u READY=“ACTION\u DATA\u UPDATE\u READY”; 私有MyTestReceiver mTestReceiver=null; 私有mAdapter=null; @凌驾 创建时受保护的void(Bundle savedInstanceState){ //其他所需的初始化 mTestReceiver=新的MyTestReceiver(此); } @凌驾 恢复时公开作废(){ super.onResume(); 如果(null!=mTestReceiver){ registerReceiver(mTestReceiver,新的意向过滤器(操作\数据\更新\准备就绪)); } } void onDataAvailable(ArrayList newDataList){ //假设您希望替换现有数据,但不愿意附加到现有数据集 mAdapter.clear(); mAdapter.addAll(newDataList); mAdapter.notifyDataSetChanged(); } }
在更新数据的代码中,发出一条消息,表示数据已更改。。。 (您需要访问活动或应用程序上下文才能执行此操作)

然后在活动中使用以下代码捕获消息,并告诉ListAdapter更新

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();
}

信贷:改编自Vogella

LocalBroadcastManager.getInstance(context.sendBroadcast(intent))

改为


LocalBroadcastManager.getInstance(上下文).sendBroadcast(意图)


我可能错了,但它对我有效…

“现在我有一个正在侦听事件的BroadcastReceiver”--事件是什么,以及如何注册
BroadcastReceiver
(清单或
registerReceiver()
)?您好,在包含ListView的活动中进行动态注册,事件是从DownloadManager下载的操作。在BroadcastReceive实现的onReceive中,您必须:修改自定义适配器的基础数据并调用notifyDataSetChanged或创建新的自定义适配器并将其设置为listview@Selvin如果我可以从接收器访问listview,那就很容易了。我可以打电话给getAdapter。我不知道如何从接收方访问listview(避免静态或getter)您说过您有来自活动的动态接收方。。。因此,我认为代码看起来像是您可以访问onReceive中的listview(findViewById(R.id.id_of_listview)应该可以工作,因为这个实现将不是静态的活动内部类)它不能正常工作。请详细说明你的答案。我认为“//代码刷新…”部分是这里最难的部分。
Intent intent = new Intent("ListViewDataUpdated");
LocalBroadcastManager.getInstance(context.sendBroadcast(intent));
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();
}