同一個Activity中不同Fragment的資料傳遞
阿新 • • 發佈:2019-01-07
參考文章:http://blog.csdn.net/harvic880925/article/details/44966913
最近在專案中需要實現這樣的一個需求:
同一個Activity中有兩個Fragment,然後有兩Fragment。兩Fragment中又巢狀著不同的ListView。
然後實現從Fragment1中的ListView點選item之後新增到Fragment2的ListView中
先來了解下這個情況。
關於Fragment的資料傳遞,其實有兩種情況
情況一:Fragment之間的顯示和隱藏是使用replace去實現的
情況二:Fragment之間的顯示和隱藏是使用hide和show方法實現的
這個大家都知道了,具體看自己專案需求。
具體情況有不同的解決方法,
對於情況一,我們可以使用fragment.setArgument()方法傳遞資料(詳細參考於大神的blog)
重點說說第二種情況吧,通過介面回撥的方法實現資料傳遞
文獻參考:http://www.cnblogs.com/kissazi2/p/3440257.html
設定介面回撥的步驟:
1.Fragment1中定義一個介面
public interface onDataChangedListener { void onDataChanged(HarvestBean bean); //引數為使用者需要傳遞的資料內容,這裡我用的是一個Bean物件 }
2.同時在Fragment1中的某個方法例項化該介面
onDataChangedListener listener = (onDataChangedListener) getActivity();
listener.onDataChanged((HarvestBean) msg.obj);
PS:在這裡我是直接傳入一個Bean物件的,因為我在onDataChanged(HarvestBean bean);方法裡面設定的引數為Bean
3.在父Activity中實現該介面並重寫onDataChanged();方法,同時通過呼叫Fragment2的updateData();方法更新Fragment2的資料
@Override
public void onDataChanged(HarvestBean bean) {
if (expressFragment != null) {
expressFragment.updateData(bean);
} else {
Log.i("harvest", "為空?");
}
}
4.在Fragment2中建立一個公共的方法updateData(HarvestBean bean)方法用於更新Fragment2中LitView的資料
List<HarvestBean> data = new ArrayList<>();
public void updateData(HarvestBean harvestBean) {
bean = harvestBean;
data.add(bean);
mLv_express.setAdapter(new ExpressAdapter(getActivity(), data));
}
這樣就實現了我們的需求了。
關於介面回撥,在論壇裡面還有那麼一句有趣的話瞭解為啥子用介面回撥
為什麼要用回撥函式?舉例如下你餓了,想吃飯,就一會去問你媽一聲"開飯沒有啊?"這就正常函式呼叫. 但是今天你媽包餃子,花的時間比較長,你跑啊跑啊,就煩了.於是你給你媽說,我先出去玩會,開飯的時候打我手機.等過了一陣,你媽給你打電話說"開飯啦,快回來吃飯吧!"
其中,你告訴你媽打手機找你,就是個你把回撥函式控制代碼儲存到你媽的動作.你媽打電話叫你,就是個回撥過程.
轉自:http://hi.baidu.com/%CE%E2_%F0%A9/blog/item/eec507cf7e72d20f92457eb2.html