1. 程式人生 > >Android入門筆記(四)

Android入門筆記(四)

 四、fragment argument 和 頁面資料更新

4.1 為什麼要使用 fragment argument

       當 fragment 和 activity 間的資料進行傳遞時,如果只是簡單的使用 intent 的 extra 來進行傳遞資訊,不僅破壞了 fragment 的封裝,停駛也使得 fragment 變為不可複用的結構單元,而使用 fragment argument 的時候,資料資訊儲存在 fragment bundle 中,這樣很好的進行資料的儲存和傳遞,同時相比於使用 onSaveInstanceState 方法,這種方式更加的清晰直白,更容易進行後期的相關維護。

4.2 fragment argument 的使用方法

(1)要附加 argument bundle 給 fragment ,需要呼叫 Fragment.setArgument 方法,而且應當在 fragment 建立後、新增給 activity 之前完成。所以相對比較好的解決方法是:新增名為 newInstance() 的靜態方法給 fragment 類。使用該方法,完成 fragment 例項化及 Bundle 物件的建立,然後將 argument 放入 bundle 中,最後再附加給 fragment。

    public static ArticleFragment newInstance(UUID uuid) {

        Bundle bundle = new Bundle();
        bundle.putSerializable(EXTRA_ARTICLE_ID, uuid);

        ArticleFragment fragment = new ArticleFragment();
        fragment.setArguments(bundle);

        return fragment;
    }

(2)當在 fragment 中獲取 argument 時,只需呼叫 Fragment.getArgument 方法,再呼叫 Bundle 限定型別的 get 方法即可。

        UUID id = (UUID) getArguments().getSerializable(EXTRA_ARTICLE_ID);

4.3 使用 onResume 更新頁面資料

       當我們從列表頁面進入到詳情頁面的時候,會遇到儘管我們已經在詳情頁修改了資訊,但當我們退回列表頁時才發現列表中的資料並未更新,那為什麼會出現這樣的現象呢。當我們進入詳情頁面時,詳情頁面被置於棧頂,而原來處於棧頂的列表頁面被暫停並停止,當我們從詳情頁面回退到列表頁面的時候,詳情頁面被銷燬,列表頁面這時才會被重啟並恢復執行,因此它無法做到實時更新資訊。

      解決這個問題的方法就是在列表頁面的 fragment 的 onResume 方法中重新呼叫更新資料的方法來重新整理頁面,也就是之前寫到的 updateUI 方法,並且每次呼叫該方法時都判斷一下是否已經建立了 Adapter 。

    private void updateUI() {
        ArticleLab articleLab = ArticleLab.get(getActivity());
        List<Article> articles = articleLab.getmArticles();

        if (mAdapter == null){
            mAdapter = new ArticleAdapter(articles);
            mRecyclerView.setAdapter(mAdapter);
        }else {
            mAdapter.notifyDataSetChanged();
        }

    }

4.4 notifyDataSetChanged() 和 notifyItemChanged(int)

       這兩種方法,第一個是通知 RecyclerView 重新整理全部可見列表項,而第二種方法是隻重新整理特定的已改變資料的列表項,所以相比起來,第二種方法更加的高效,並且當頁面具有較多的圖片時,第一種方式還有可能帶來閃圖的問題。

      但當使用第二種方式來重新整理特定的列表項時,需要先定位到該項,我暫時想到的方法是在列表項的點選事件中使用 RecyclerView.getChildAdapterPositon 方法來獲取該 ItemView 在Adapter 中的 position, 並使用變數來對其進行儲存,然後當用戶返回後在 updateUI 也就是 onResume 中進行重新整理。

            mClickedItem = mCrimeRecyclerView.getChildAdapterPosition(view);