use*_*519 2 java android fragment
我基本上有一个MainActivity,有多个标签.每个选项卡都是一个ShowListFragment,它扩展了Fragment.现在,每个选项卡都包含我从数据库中获取的数据.我有一个MOVE按钮,可以在每个片段中将数据从一个选项卡移动到另一个选项卡:
@Override
public void onClick(DialogInterface dialog, int listIndex) {
database.add(listIndex,object);
database.remove(listIndex,object);
}
Run Code Online (Sandbox Code Playgroud)
片段不会直接更新,但是在选项卡之间进行了几次滑动(确切地说是3).单击按钮后,如何强制片段立即更新?我不想通过ViewPager中的onPageSelected来管理它,因为它不会更新我当前正在使用的片段,而是在我刷到下一个片段之后.而且我也不想在每次滑动后更新数据.
我知道我可能需要使用某种类似的观察者模式:当它扩展另一个类时,如何使一个类扩展Observable? 但是,我仍然不确定如何直接更新片段,以及如何在我的应用程序中应用观察者/事件模式.
kri*_*son 22
由于片段可以很容易地访问活动getActivity(),我会将活动作为调度更新的中心枢纽.
听起来您已经使用数据库处理了持久性部分,您只需要一些更新事件.所以这里:
定义侦听器接口.我通常将此作为活动中的内部接口:
public interface DataUpdateListener {
void onDataUpdate();
}
Run Code Online (Sandbox Code Playgroud)向活动添加数据结构以跟踪侦听器:
private List<DataUpdateListener> mListeners;
Run Code Online (Sandbox Code Playgroud)
不要忘记在构造函数中初始化:
mListeners = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)将注册/取消注册方法添加到活动:
public synchronized void registerDataUpdateListener(DataUpdateListener listener) {
mListeners.add(listener);
}
public synchronized void unregisterDataUpdateListener(DataUpdateListener listener) {
mListeners.remove(listener);
}
Run Code Online (Sandbox Code Playgroud)将事件方法添加到您的活动中:
public synchronized void dataUpdated() {
for (DataUpdateListener listener : mListeners) {
listener.onDataUpdate();
}
}
Run Code Online (Sandbox Code Playgroud)让您的片段实现DataUpdateListener:
public class MyFragment extends Fragment implements DataUpdateListener {
Run Code Online (Sandbox Code Playgroud)
并实施该方法
@Override
public void onDataUpdate() {
// put your UI update logic here
}
Run Code Online (Sandbox Code Playgroud)覆盖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);
}
Run Code Online (Sandbox Code Playgroud)在片段的UI更新事件中触发事件:
@Override
public void onClick(DialogInterface dialog, int listIndex) {
database.add(listIndex,object);
database.remove(listIndex,object);
((MainActivity) getActivity()).dataUpdated();
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
7161 次 |
| 最近记录: |