从外部广播接收器更新适配器数据



我有一个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();
        }
    }

最新更新