从外部BroadcastReceiver更新适配器数据

时间:2014-12-01 21:40:24

标签: android

我有一个BroadcastReceiver,用于AlarmManger设置的不同闹钟。此接收器将在启动时检查事件是否已满足(取决于位置)。

这些事件通过BaseExpandableListAdapter显示。从Receiver更新适配器中的事件的最简单方法是什么? 接收器不能是内部类!它用于不同的活动和碎片!

我尝试的是将回调传递给我的适配器以通知Activity / Fragment更新数据。 "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();
            }
        });
    }
}

2 个答案:

答案 0 :(得分:1)

使用观察者模式,让所有适配器实现一个接口,让我们说Updatable,包含update()方法。

有任何经理&#34;单身&#34;或者您的应用程序类,在所有活动或具有需要更新的适配器的片段中都有一个List,将该适配器添加到列表中,在销毁活动或片段时,从列表中删除适配器。 / p>

当你有需要更新适配器的东西时,循环遍历列表并调用他们的更新方法。

答案 1 :(得分:1)

也许你在代码中的某个地方这样做了。但我无法找到它。

您需要在片段中注册广播接收器。

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

在你的onReceive

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