Android 如何从BroadcastReceiver刷新ListView?
如果我在与我的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";
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();
}
信贷:改编自VogellaLocalBroadcastManager.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();
}