Android編程權(quán)威指南(第二版)學(xué)習(xí)筆記(十)—— 第10章 使用 fragment argument

本章主要介紹了如何使用 fragment 的 arguments 來(lái)傳遞信息
GitHub 地址:
完成第十章

1. 從 fragment 中啟動(dòng) activity

1.1 直接啟動(dòng)

從 fragment 中直接啟動(dòng) acitivity 的方法一般如下:

Intent intent = new Intent(getActivity(), TargetActivity.class);
startActivity(intent);

Fragment 中也帶有 startActivity()方法崭捍,其中 Intent 構(gòu)造方法需要的 Context 對(duì)象可以通過(guò) getActivity() 方法獲得拄衰。

1.2 附加 extra 信息

一般來(lái)說(shuō),為了保證類(lèi)之間的獨(dú)立,啟動(dòng)一個(gè) activity 的 intent 及其需要的參數(shù)應(yīng)該寫(xiě)在目標(biāo) activity 中缴淋,對(duì)于 fragment 同樣如此戚长。

對(duì)需要啟動(dòng)的目標(biāo) activity 可以如下:

//先定義一個(gè) key 以便識(shí)別
private static final String EXTRA_KEY = "com.kniost.appname.activity_name";

//然后定義一個(gè)獲取專(zhuān)用的 Intent 的靜態(tài)公有方法
public static Intent newIntent(Context context, Object data) {
    Intent intent = new Intent(context, TargetActivity.class);
    intent.putExtra(EXTRA_KEY, data);
    return intent;
}

在需要的時(shí)候調(diào)用這個(gè)方法得到 Intent 并啟動(dòng)即可敦腔。

1.3 獲取 extra 信息

activity 可以通過(guò) getIntent().getExtra() 方法直接獲取信息缆八,然而真正需要信息的是 fragment。fragment 可不能用 intent 啟動(dòng)蛔琅。

在 fragment 中有兩種方法可以獲取信息:

  • 一是從 activity 的 extra 中獲取信息胎许。這種方法比較簡(jiǎn)單,但是不推薦罗售,因?yàn)樗乒至?fragment 的封裝性辜窑,不利于解耦(在一個(gè)類(lèi)中用到另一個(gè)類(lèi)的變量),不便于復(fù)用寨躁。
Object data = (Object) getActivity().getIntent().getSerializable(EXTRA_KEY);
  • 第二個(gè)就是比較好的做法穆碎,那就是將數(shù)據(jù)存放在 fragment 的 argument bundle 中,這樣無(wú)需托管的 activity 的 intent 內(nèi)指定 extra 的存在职恳,fragment 本身就能獲取自己所需的 extra 數(shù)據(jù)所禀。

    和給一個(gè) activity 傳遞 extra 信息類(lèi)似,一般也會(huì)在目標(biāo)fragment 中添加一個(gè)公有的靜態(tài)方法 newInstance()放钦,參數(shù)則是需要的 extra 信息

```java

//首先也要定義一個(gè) key 用于獲取數(shù)據(jù)
private static final String ARG_EXTRA_KEY = "data_I_need";
……
public static TargetFragment newInstance(Object data) {
Bundle args = new Bundle();
args.putSerializable(ARG_EXTRA_KEY, data);
TargetFragment fragment = new TargetFragment();
fragment.setArguments(args);
return fragment;
}
```

這樣色徘,在托管的 activity 中新建 TargetFragment 類(lèi)的時(shí)候只要調(diào)用 TargetFragment.newInstance(Object data) 來(lái)獲取實(shí)例即可。

在 fragment 里獲取 argument 的方法比較簡(jiǎn)單操禀,直接調(diào)用 getArguments().getX() 方法即可褂策,其中 X 表示可以從 Bundle 中獲取的類(lèi)型,Serializable 是比較常用的傳遞復(fù)雜參數(shù)的方法。

2. 刷新顯示列表項(xiàng)

由于書(shū)上的例子中使用的是單例斤寂,也就是說(shuō)對(duì)于 Adapter 和 Fragment 來(lái)說(shuō)使用的數(shù)據(jù)都是指向同一地址的耿焊,只要在某處修改了,所有使用該數(shù)據(jù)的地方實(shí)際都改變了遍搞。這樣的話罗侯,修改數(shù)據(jù)之后只需要使用 RecyclerView.Adatper 的方法 notifyDataSetChanged() 即可刷新 RecyclerView 了。

3. 挑戰(zhàn)練習(xí):實(shí)現(xiàn)高效的 RecyclerView 刷新

使用 notifyItemChanged(int position) 方法可以高效地刷新單個(gè)被修改的 ViewHolder尾抑。

對(duì)于本書(shū)的這個(gè)問(wèn)題歇父,有特殊的做法。因?yàn)檫@個(gè) RecyclerView 和 fragment 是寫(xiě)在一個(gè)類(lèi)中的再愈,而且一次只會(huì)有一個(gè) ViewHolder 被改變,所以可以通過(guò)讀寫(xiě)同一個(gè)成員變量來(lái)判斷修改的 item 的位置护戳。

以下是具體解決方法:

//CrimeListFragment.java

private int positionClicked;

然后在 ViewHolder 的構(gòu)造函數(shù)建立 Listener 的時(shí)候用 getAdapterPosition() 方法記錄下被點(diǎn)擊的 ViewHolder 的位置

@Override
public void onClick(View view) {
    Intent intent = CrimeActivity.newInent(getActivity(), mCrime.getId());
    positionClicked = getAdapterPosition();
    startActivity(intent);
}

最后在 updateUI() 函數(shù)中直接調(diào)用 mAdapter.notifyItemChanged(positionClicked);

if (mAdapter == null) {
   mAdapter = new CrimeAdapter(crimes);
   mCrimeRecyclerView.setAdapter(mAdapter);
} else {
   mAdapter.notifyItemChanged(positionClicked);
}

GitHub Page: kniost.github.io
簡(jiǎn)書(shū):http://www.reibang.com/u/723da691aa42

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末翎冲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子媳荒,更是在濱河造成了極大的恐慌抗悍,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钳枕,死亡現(xiàn)場(chǎng)離奇詭異缴渊,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)鱼炒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)衔沼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人昔瞧,你說(shuō)我怎么就攤上這事指蚁。” “怎么了自晰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵凝化,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我酬荞,道長(zhǎng)搓劫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任混巧,我火速辦了婚禮枪向,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘牲剃。我一直安慰自己遣疯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著缠犀,像睡著了一般数苫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辨液,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天虐急,我揣著相機(jī)與錄音,去河邊找鬼滔迈。 笑死止吁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的燎悍。 我是一名探鬼主播敬惦,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谈山!你這毒婦竟也來(lái)了俄删?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤奏路,失蹤者是張志新(化名)和其女友劉穎畴椰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鸽粉,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斜脂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了触机。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帚戳。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖威兜,靈堂內(nèi)的尸體忽然破棺而出销斟,到底是詐尸還是另有隱情,我是刑警寧澤椒舵,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布蚂踊,位于F島的核電站,受9級(jí)特大地震影響笔宿,放射性物質(zhì)發(fā)生泄漏犁钟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一泼橘、第九天 我趴在偏房一處隱蔽的房頂上張望涝动。 院中可真熱鬧,春花似錦炬灭、人聲如沸醋粟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)米愿。三九已至厦凤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間育苟,已是汗流浹背较鼓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留违柏,地道東北人博烂。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像漱竖,于是被迫代替她去往敵國(guó)和親禽篱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容