標籤:

使用 SugarAdapter 快速構建 Android 列表頁面

知乎 App 中存在大量的列表頁面,可預見的未來還會不斷增加,因此需要一種易上手、可維護的列表「腳手架」來支撐業務需求。

假定讀者對 RecyclerView 的 原始寫法 相對熟悉。一些簡化 RecyclerView 使用難度的方案試圖通過繞過 ViewHolder 的概念,進而直接操縱 ViewHolder 其中的 View ,代碼相對中心化,失去了 ViewHolder 的可復用性;另一些也沒能簡化編寫 Adapter 的冗餘代碼,僅僅把 Adapter 的概念帶到了其他地方。SugarAdapter 不會試圖逃避任何 RecyclerView 的所有概念,僅僅是寫法上的簡化,沒有額外的認知成本(詳細介紹可參見 GitHub 鏈接 )。

首先,你不需要繼承並複寫 Adapter ,即使是複雜類型的列表,也只需要寫幾行 Builder 模式的代碼,冗餘代碼全部通過 annotationProcessor 生成:

mAdapter = SugarAdapter.Builder.with(mList) // eg. List<Object>
.add(FooHolder.class) // extends SugarHolder<Foo>
.add(BarHolder.class, new SugarHolder.OnCreatedCallback<BarHolder>() {
@Override
public void onCreated(@NonNull BarHolder holder) {
// holder.SETTER etc.
}
})
.build();
mRecyclerView.setAdapter(mAdapter);

// mAdapter.notifyItem* or mAdapter.notifyDataSetChanged()
// mAdapter.setExtraDelegate() with onAttachedToRecyclerView()/onDetachedFromRecyclerView()

接著是 SugarHolder 。在長時間使用 RecyclerView 創建多種列表視圖的過程中,我們注意到,通常對於一個 ViewHolder 而言,其 ViewType(類型)、Layout(視圖層)和 Data(數據)是強相關的,因此我們簡單認為 Layout – ViewType – Data 是「三位一體」的存在,這一模式對於簡化 RecyclerView 的使用十分有效。此外,ViewHolder 本身可以視為列表中細粒度的 Controller ,與編寫一個簡單的 Activity 或者 Fragment 沒有明顯區別:

// 務必註解的保證子類是 public 和 final 的;R.layout.foo 同時也是 ViewType
@Layout(R.layout.foo)
public final class FooHolder extends SugarHolder<Foo> {
// 如果你不想手寫 findViewById() 代碼,
// 只需要給定義的 View 加上 @Id() 註解,並且保證它為 public 的即可;
// @Id() 同樣只能作用於 **final** class
@Id(R.id.text);
public TextView mTextView;

public FooHolder(@NonNull View view) {
super(view);
}

@Override
pubilc void onBindData(@NonNull Foo foo) {
mTextView.setText(foo.getText());
}
}

經過上述過程,構造列表頁面的過程基本完成了。在 annotationProcessor 的幫助下省去了需要人工編寫的冗餘代碼,同時隱藏了中心化的列表綁定邏輯,使得 RecyclerView 的相關的代碼更易於維護和上手。經過知乎 Android 一年多的線上實踐表明,這種設計在客戶端存在大量列表視圖類型的情況下,其複雜度並沒有提升,可以說是一套不錯的解決方案(其實是我比較懶,一年多前寫好了,現在才開源。

項目地址和詳細解釋:github.com/zhihu/SugarA

(不要忘記點擊右上角的 Star ??按鈕喲

我想馬上引入:

dependencies {
// 如果你想要遷移到 AndroidX ,可以使用 1.8.3
implementation com.zhihu.android:sugaradapter:1.7.5
annotationProcessor com.zhihu.android:sugaradapter-processor:1.7.5
}

這裡是廣告:知乎社區平台移動端團隊,負責知乎社區核心產品的開發與維護工作,為知乎社區移動端的體驗和技術建設負責。在知乎成長的過程中,我們渴望對技術有追求的小夥伴加入,一起解決知乎移動端在實際業務中面對的技術挑戰,攻克關乎用戶體驗的各項技術難題。簡歷請投遞至 mthli@zhihu.com ??


推薦閱讀:

TAG:Android |