1. 程式人生 > >同一個Activity中不同Fragment的資料傳遞

同一個Activity中不同Fragment的資料傳遞

參考文章: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