我基本上有一个MainActivity,它有多个标签。每个选项卡都是一个ShowListFragment,它扩展了Fragment。现在,每个选项卡都包含我从数据库中获取的数据。我有一个MOVE按钮,可以在每个片段中将数据从一个选项卡移动到另一个选项卡:
@Override
public void onClick(DialogInterface dialog, int listIndex) {
database.add(listIndex,object);
database.remove(listIndex,object);
}
片段不会直接更新,但在选项卡之间进行了几次滑动(确切地说是3)。单击按钮后,如何强制片段立即更新?我不想通过ViewPager中的onPageSelected来管理它,因为它不会更新当前打开的片段,但是在我刷新到下一个片段之后。而且我也不想在每次刷卡后更新数据。
我知道我可能需要使用某种观察者模式:How do I make a Class extend Observable when it has extended another class too? 但是,我仍然不确定如何直接更新片段,以及如何在我的应用程序中应用观察者/事件模式。
答案 0 :(得分:21)
由于片段可以使用getActivity()
轻松访问活动,因此我会将活动作为调度更新的中心枢纽。
听起来您已经使用数据库处理了持久性部分,您只需要一些更新事件。所以这里:
定义侦听器接口。我通常将此作为活动中的内部接口:
public interface DataUpdateListener {
void onDataUpdate();
}
向您的活动添加数据结构以跟踪听众:
private List<DataUpdateListener> mListeners;
不要忘记在构造函数中初始化:
mListeners = new ArrayList<>();
将注册/取消注册方法添加到活动:
public synchronized void registerDataUpdateListener(DataUpdateListener listener) {
mListeners.add(listener);
}
public synchronized void unregisterDataUpdateListener(DataUpdateListener listener) {
mListeners.remove(listener);
}
将事件方法添加到您的活动中:
public synchronized void dataUpdated() {
for (DataUpdateListener listener : mListeners) {
listener.onDataUpdate();
}
}
让您的片段实现DataUpdateListener:
public class MyFragment extends Fragment implements DataUpdateListener {
并实施方法
@Override
public void onDataUpdate() {
// put your UI update logic here
}
覆盖片段中的onAttach()
和onDestroy()
以注册/取消注册:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((MainActivity) activity).registerDataUpdateListener(this);
}
@Override
public void onDestroy() {
super.onDestroy();
((MainActivity) getActivity()).unregisterDataUpdateListener(this);
}
在片段的UI更新事件中触发事件:
@Override
public void onClick(DialogInterface dialog, int listIndex) {
database.add(listIndex,object);
database.remove(listIndex,object);
((MainActivity) getActivity()).dataUpdated();
}