我有2次基本相同的数据的:同步ListFragment和SupportMapFragment选择
两者都使用加载器图案以获得相同的数据的上述(延伸LoaderCallbacks,查询的ContentProvider,等等)
均为单activity内托管的内部的ViewPager。
为这两个片段同步当前选定列表项/标记的最佳策略是什么? (请考虑“我的地点”编辑用户界面或Google地图的“路线”,左侧窗格和中心地图)。
场景我在想这么远:
- 让每一个片段手动通知它是关于通过回调接口选择改变对方(这可能会涉及基本活动,协调跨段通信,因此建议由Android文档)。
- 以某种方式使这两个片段使用相同的游标,甚至是ListAdapter(无论它对于地图而言意味着什么,因为现在它直接从游标填充)。
- (别的东西吗?)
也许有人已经处理了这个确切的情况? (我肯定会找到一些解决办法,只是想避免“重新发明轮子”。对不起,一个过于概念化的问题。)
编辑(解决方案)
我觉得马切伊已经回答了我的问题相关的( “最佳策略”,等..),所以答案都是和 ;-)
走进更多的细节,我的实现是这样的:
起初我吓坏了由eno在Java中处理发布者/订阅者模式的开销(涉及接口,为回调找到适当的地方,以及不是)。幸运的是,Otto总线执行引起了我的注意,这使得碎片之间的通信变得微不足道。它不仅可以通知有关选择改变所有的用户,也是整个装载机啪适合很好:
从奥托的示例代码借用BusProvider类。
创建几个消息协定携带通知数据:
public class LocationSelectedEvent { public long id; } public class LocationsLoadedEvent { public Cursor cursor; }
注释“接收器”的方法中的片段与@Subscribe(实施例下列是为加载器的情况下,用于选择的改变它没有更复杂的):
@Subscribe public void onLoadFinished(LocationsLoadedEvent event) { final CursorAdapter a = (CursorAdapter) getListAdapter(); a.swapCursor(event.cursor); }
制作片段 “听” 的通知:
@Override public void onActivityCreated(Bundle savedInstanceState) { BusProvider.getInstance().register(this); }
使片段停止听时,他们不是“活着”(专为真正的片段API,学会了它艰难地):
@Override public void onDestroy() { super.onDestroy(); BusProvider.getInstance().unregister(this); }
最后,触发通知,其中所需的(例如下面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(); }
奖励:通知流动可视
Maciej,关于加载相同数据两次的好处。我这样做的唯一原因是保持碎片自成体系。我可能会重新考虑这种方法。 – esteewhy
OFFTOPIC:哦,你是地图扩展的开发者!要尽快尝试。 – esteewhy