使用 SugarAdapter 快速構建 Android 列表頁面
知乎 App 中存在大量的列表頁面,可預見的未來還會不斷增加,因此需要一種易上手、可維護的列表「腳手架」來支撐業務需求。
假定讀者對 RecyclerView 的 ofollow,noindex">原始寫法 相對熟悉。一些簡化 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 一年多的線上實踐表明, 這種設計在客戶端存在大量列表檢視型別的情況下,其複雜度並沒有提升,可以說是一套不錯的解決方案(其實是我比較懶,一年多前寫好了,現在才開源。
專案地址和詳細解釋: https:// github.com/zhihu/SugarA dapter
(不要忘記點選右上角的 Star :star2:按鈕喲
我想馬上引入:
dependencies { // 如果你想要遷移到 AndroidX ,可以使用 1.8.3 implementation 'com.zhihu.android:sugaradapter:1.7.5' annotationProcessor 'com.zhihu.android:sugaradapter-processor:1.7.5' }
這裡是廣告: 知乎社群平臺移動端團隊,負責知乎社群核心產品的開發與維護工作,為知乎社群移動端的體驗和技術建設負責。在知乎成長的過程中,我們渴望對技術有追求的小夥伴加入,一起解決知乎移動端在實際業務中面對的技術挑戰,攻克關乎使用者體驗的各項技術難題。簡歷請投遞至[email protected] :beers: