Android RecyclerView in MVP — 把 ViewHolder 的邏輯移到 Presenter 去做吧
之前看到了上面這一篇文章裡面寫的蠻有意思的
也解決了我疑惑很久的一件事
傳統上我們在寫 RecyclerView 的時候
會把資料傳進去給 RecyclerViewAdapter
然後一些資料的處理可能就會在 Adapter 中做處理
但這不就跟 MVP 的慨念互斥了嗎
資料應該要在 Presenter 做處理啊
怎麼會是在 View 這一層的 Adapter 裡面做呢
改變的方法也很簡單
把原本傳進去的資料改成傳 Presenter 進去
讓 Adapter 去通知 Presenter 更改資料
原本的一般的方法是像下面這樣:
稍微修改一下變成這樣:
以一般一定要實做的三個方法裡面
更動的地方只有 getItemCount() 和 onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) 這兩個方法
這時候另一個問題又來了
眼尖的人應該已經發現了
這邊把 RecyclerView.ViewHolder 傳進去 Presenter 裡面去了
這又犯了 MVP 裡面的大忌了
Presenter 應該是要純粹乾靜的 Java code (or Kotlin code..)
不可以有任何 Android Framework 的東西
修正方法也一樣很簡單
就是找我們的老朋友 — interface
先讓 ViewHolder 去繼承我們自訂的一個 ItemView interface
接著在 Presenter 裡面只要對 interface 做操作就可以了
詳細的 interface 架構是長這樣子的:
可以看到在 onBindViewHolder(bookItemView: BookItemView,position:Int) 的地方
傳進去的是 BookItemView 這個 interface
最後只要在 ViewHolder 裡面實做 BookItemView 的 interface 就大功告成了
現在把資料處理的邏緝都移到 Presenter 裡面去啦
測試也好寫多了
啊~世界多麼美麗! 啊~空氣多麼清新!
這篇文章簡單的介紹了把 RecyclerView 裡的邏緝移到 Presenter 裡的方法
電商的 App 裡面有一堆山多的 RecyclerView
所以基本上每天都會玩到 RecyclerView
如何更佳更好的使用就成了一個重要的課題
這個方法我自已其實已經使用了一段時間
覺得用起來非常的優雅漂亮
把舊的 code 修改過來也很簡單
很推薦大家一起來使用啦
最後附上一個簡單的 sample code 給大家參考
可以切換不同的分支看傳統和修改過的寫法
有問題也歡迎來討論啦~