我有一个BroadcastReceiver
,用于AlarmManger
设置的不同警报。此接收器将在事件开始时检查事件是否已完成(取决于位置)。
这些事件通过BaseExpandableListAdapter
显示。从接收器更新适配器中的事件的最简单方法是什么?接收器不能是内部类!它用于不同的活动和片段!
我尝试的是将回调传递给我的适配器以通知活动/片段更新数据。 "Events before"
和 "Events after"
始终为 0(我认为这是由于 getInstance()
方法以某种方式失败)。
public class EventAdapter(Context context, List<Event> events, EventAdapterCallback callback) {
super();
this.context = context;
this.events = events;
this.callback = callback;
instance = this;
}
public static EventAdapter getInstance() {
return instance;
}
public void requestUpdate() {
callback.update();
}
public class EventBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
// ... doing my stuff
// send live update to the adapter
EventAdapter.getInstance().requestUpdate();
}
}
public class RandomFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
eventsAdapter = new EventAdapter(getActivity(), events, new EventAdapterCallback() {
public void update() {
Log.i("Events before:", String.valueOf(events.size()));
events.clear();
events.addAll(database.getList());
Log.i("Events after:", String.valueOf(events.size()));
eventsAdapter.notifyDataSetChanged();
}
});
}
}
使用观察者模式,使所有适配器实现一个接口,比如说 Updataable,包含一个 update() 方法。
具有任何管理器"单一实例"或应用程序类,在所有活动或片段中列出具有需要更新的适配器的任何内容,将该适配器添加到列表中,在销毁活动或片段时,从列表中删除适配器。
当您有需要更新适配器的内容时,请遍历列表并调用其更新方法。
也许您正在代码中的某个地方执行此操作。但我找不到它。
您需要在片段中注册广播接收器。
@Override
public void onResume()
{
super.onResume();
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance (this);
localBroadcastManager.registerReceiver (<instance-of-your-broadcast-receiver>, new IntentFilter ("UpdateRandomFragment"));
}
@Override
public void onPause()
{
super.onPause();
LocalBroadcastManager.getInstance(this).unregisterReceiver (<instance-of-your-broadcast-receiver>);
}
在您的接收中
@Override
public void onReceive(final Context context, Intent intent)
{
String action = intent.getAction();
if (action.equals ("UpdateRandomFragment"))
{
((RandomFragment)context).eventAdapter.clear();
((RandomFragment)context).eventAdapter.addAll(...);
((RandomFragment)context).eventAdapter.notifyDataSetChanged();
}
}