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);