gpt4 book ai didi

android - 同步 ListFragment 和 SupportMapFragment 选择

转载 作者:行者123 更新时间:2023-11-30 03:35:31 25 4
gpt4 key购买 nike

我对基本相同的数据有 2 个 View :

  1. List android.support.v4.app.ListFragment
  2. 中的项目
  3. map 上的标记在 com.google.android.gms.maps.SupportMapFragment

以上都是使用加载器模式获取相同的数据(扩展LoaderCallbacks,查询ContentProvider等)

两者都托管在一个 activity 中在 ViewPager 中。

为这两个 fragment 同步当前选择的列表项/标记的最佳策略是什么? (想想“我的地点”编辑 UI,或 Google map 的“方向”,其左侧 Pane 和中间的 map )。

到目前为止我想到的场景:

  1. 让每个 fragment 通过回调接口(interface)手动通知其对应的选择更改(这可能涉及协调 fragment 间通信的底层 Activity ,正如 Android 文档所建议的那样)。
  2. 以某种方式使两个 fragment 使用相同的 Cursor,甚至 ListAdapter(无论它对 map 意味着什么,因为现在它直接从光标填充)。
  3. (还有别的吗?)

也许有人已经处理过这个确切的案例? (我一定会找到一些解决方案,只是想避免“重新发明轮子”。抱歉,这个问题过于概念化。)

编辑(解决方案)

我认为 Maciej 已经回答了我的确切问题(“最佳策略”,等等),所以答案是 12 ;-)

进入更多细节,我的实现是这样的:

起初,我对在 Java 中处理发布者/订阅者模式的巨大开销感到害怕(涉及接口(interface)、为回调找到合适的位置,以及其他不相关的内容)。还好,Otto总线实现引起了我的注意,这使得 fragment 之间的通信变得微不足道。不仅可以将选择更改通知所有订阅者,而且整个 Loader Patter 也非常适合:

  1. 从 Otto 的示例代码中借用 BusProvider 类。

  2. 创建一些消息合约来携带通知数据:

    public class LocationSelectedEvent {  
    public long id;
    }

    public class LocationsLoadedEvent {
    public Cursor cursor;
    }
  3. 使用@Subscribe 注释 fragment 中的“receiver”方法(下面的示例是针对加载程序的情况,对于选择更改它不再复杂):

    @Subscribe
    public void onLoadFinished(LocationsLoadedEvent event) {
    final CursorAdapter a = (CursorAdapter) getListAdapter();
    a.swapCursor(event.cursor);
    }
  4. 让 fragment “监听”通知:

    @Override  
    public void onActivityCreated(Bundle savedInstanceState) {
    BusProvider.getInstance().register(this);
    }
  5. 让 fragment 在不“活跃”时停止监听(对于 fragment API 尤其如此,通过艰难的方式学习):

    @Override  
    public void onDestroy() {
    super.onDestroy();
    BusProvider.getInstance().unregister(this);
    }
  6. 最后,在需要的地方触发通知(下面的示例说明了如何在加载光标时从 LocationList Activity 通知):

    @Override
    public void onResume() {
    if(null == getLoaderManager().getLoader(0)) {
    getSupportLoaderManager().initLoader(0, null, new LoaderCallbacks<Cursor>() {
    @Override
    public Loader<Cursor> onCreateLoader(int paramInt, Bundle paramBundle) {
    return new CursorLoader(LocationsList.this, Locations.CONTENT_URI, null, null, null, null);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> paramLoader, Cursor cursor) {
    BusProvider.getInstance().post(new LocationsLoadedEvent(cursor));
    }

    @Override
    public void onLoaderReset(Loader<Cursor> paramLoader) {
    BusProvider.getInstance().post(new LocationsLoadedEvent(null));
    }
    });
    }
    super.onResume();
    }

奖励:通知流可视化

最佳答案

对于点击协调,你的第 1 点是我会做的,当然是使用 Activity 和界面。

我很难理解为什么要从 ContentProvider 加载相同的数据两次。为什么不在共享对象中加载一次呢? Application 中的某个对象,注入(inject)单例甚至另一个 Fragment,它通知 Activity 数据加载完成并将数据推送到您的两个 fragment ?

关于android - 同步 ListFragment 和 SupportMapFragment 选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16688073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com