ViewPager+Fragment,某个Fragment里面的一条数据发生变化,如何局部刷新这条数据
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
ViewPager的item是Fragment時一般使用FragmentPagerAdapter作為Adapter, 而這個類別在添加Fragment的時候會新增tag, 看FragmentPagerAdapter的源碼中的instantiateItem()方法ViewPager的item是Fragment时一般使用FragmentPagerAdapter作为Adapter, 而这个类在添加Fragment的时候会添加tag, 看FragmentPagerAdapter的源码中的instantiateItem()方法
ViewPager
Fragment
FragmentPagerAdapter
instantiateItem()
@Override public Object instantiateItem(ViewGroup container, int position) { // 省略 if (fragment != null) { // 省略 } else { // 省略部分代码 // 下面这句就是添加Fragment的语句, 第三个参数就是指定Fragment的tag, // 你可以利用这个tag获取到对应的Fragment实例, 有了实例就可以随意更新Fragment的视图了 mCurTransaction.add(container.getId(), fragment, makeFragmentName(container.getId(), itemId)); } // 省略 return fragment; }
这个tag是通过一个makeFragmentName()的私有方法获取, 不过只要把这个方法直接复制出来就可以了, 这个方法的参数viewId应该是ViewPager的id, itemId是adapter的getItemId() rrreee 這個tag是透過一個makeFragmentName()的私有方法取得, 不過只要把這個方法直接複製出來就可以了, 這個方法的參數viewId應該是ViewPager的id , itemId是adapter的getItemId()方法, 所以可以自己組裝出tag, 取得到Fragment.
makeFragmentName()
getItemId()
如果用的RecyclerView,使用Eventbus可以這樣
mAdapter.getItem(event.position).setCommentCount(mAdapter.getItem(event.position).getCommentCount()+1); mAdapter.notifyItemChanged(event.position);
我也對這個問題萌幣過一段時間,搜尋一番也沒找到太好的辦法,pagerfragmentadapter好像也沒有提供取得對應fragment的api。 我索引搞了個弱引用的list在adapter初始化fragment的時候給它加入了,然後重寫adapter的onDestroyItem(大概是叫這個吧?記不清了)在這裡移除list中對應條目。 得到fragment實例就可以隨便操作了。
Fragment在前台時, 訂閱一個事件(消息), 可以用LocalBroadcastManager / EventBus / otto / Rx 都是可以的
Fragment切換後台時, 取消訂閱, 該Fragment再次切換到前台時, 刷新下頁面數據並重新訂閱
ViewPager
的item是Fragment
時一般使用FragmentPagerAdapter
作為Adapter, 而這個類別在添加Fragment
的時候會新增tag, 看FragmentPagerAdapter
的源碼中的instantiateItem()
方法ViewPager
的item是Fragment
时一般使用FragmentPagerAdapter
作为Adapter, 而这个类在添加Fragment
的时候会添加tag, 看FragmentPagerAdapter
的源码中的instantiateItem()
方法这个tag是通过一个
就這樣.🎜makeFragmentName()
的私有方法获取, 不过只要把这个方法直接复制出来就可以了, 这个方法的参数viewId应该是ViewPager
的id, itemId是adapter的getItemId()
rrreee這個tag是透過一個
makeFragmentName()
的私有方法取得, 不過只要把這個方法直接複製出來就可以了, 這個方法的參數viewId應該是ViewPager
的id , itemId是adapter的getItemId()
方法, 所以可以自己組裝出tag, 取得到Fragment.如果用的RecyclerView,使用Eventbus可以這樣
我也對這個問題萌幣過一段時間,搜尋一番也沒找到太好的辦法,pagerfragmentadapter好像也沒有提供取得對應fragment的api。
我索引搞了個弱引用的list在adapter初始化fragment的時候給它加入了,然後重寫adapter的onDestroyItem(大概是叫這個吧?記不清了)在這裡移除list中對應條目。
得到fragment實例就可以隨便操作了。
Fragment在前台時, 訂閱一個事件(消息), 可以用LocalBroadcastManager / EventBus / otto / Rx 都是可以的
Fragment切換後台時, 取消訂閱, 該Fragment再次切換到前台時, 刷新下頁面數據並重新訂閱