1

我有2次基本相同的数据的:同步ListFragment和SupportMapFragment选择

  1. 在android.support.v4.app项ListListFragment
  2. com.google.android.gms.maps中的map上的标记。 SupportMapFragment

两者都使用加载器图案以获得相同的数据的上述(延伸LoaderCallbacks,查询的ContentProvider,等等)

均为单activity内托管的内部的ViewPager。

为这两个片段同步当前选定列表项/标记的最佳策略是什么? (请考虑“我的地点”编辑用户界面或Google地图的“路线”,左侧窗格和中心地图)。

场景我在想这么远:

  1. 让每一个片段手动通知它是关于通过回调接口选择改变对方(这可能会涉及基本活动,协调跨段通信,因此建议由Android文档)。
  2. 以某种方式使这两个片段使用相同的游标,甚至是ListAdapter(无论它对于地图而言意味着什么,因为现在它直接从游标填充)。
  3. (别的东西吗?)

也许有人已经处理了这个确切的情况? (我肯定会找到一些解决办法,只是想避免“重新发明轮子”。对不起,一个过于概念化的问题。)

编辑(解决方案)

我觉得马切伊已经回答了我的问题相关的( “最佳策略”,等..),所以答案都是和 ;-)

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

起初我吓坏了由eno在Java中处理发布者/订阅者模式的开销(涉及接口,为回调找到适当的地方,以及不是)。幸运的是,Otto总线执行引起了我的注意,这使得碎片之间的通信变得微不足道。它不仅可以通知有关选择改变所有的用户,也是整个装载机啪适合很好:

  1. 从奥托的示例代码借用BusProvider类。

  2. 创建几个消息协定携带通知数据:

    public class LocationSelectedEvent { 
        public long id; 
    } 
    
    public class LocationsLoadedEvent { 
        public Cursor cursor; 
    } 
    
  3. 注释“接收器”的方法中的片段与@Subscribe(实施例下列是为加载器的情况下,用于选择的改变它没有更复杂的):

    @Subscribe 
    public void onLoadFinished(LocationsLoadedEvent event) { 
        final CursorAdapter a = (CursorAdapter) getListAdapter(); 
        a.swapCursor(event.cursor); 
    } 
    
  4. 制作片段 “听” 的通知:

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
        BusProvider.getInstance().register(this); 
    } 
    
  5. 使片段停止听时,他们不是“活着”(专为真正的片段API,学会了它艰难地):

    @Override 
    public void onDestroy() { 
        super.onDestroy(); 
        BusProvider.getInstance().unregister(this); 
    } 
    
  6. 最后,触发通知,其中所需的(例如下面deomnstrates当光标已经加载了如何从LocationList活动通知):

    @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

对于点击您的协调点1是我会做什么,使用活动,当然接口。

我只是很难理解为什么要从ContentProvider加载两次相同的数据。为什么不在一个共享对象中加载一次? Application里面的某些对象,注入单身或者甚至是另一个Fragment,它通知Activity数据加载完成并将数据推送到您的两个Fragments

+0

Maciej,关于加载相同数据两次的好处。我这样做的唯一原因是保持碎片自成体系。我可能会重新考虑这种方法。 – esteewhy

+0

OFFTOPIC:哦,你是地图扩展的开发者!要尽快尝试。 – esteewhy