Android RecyclerView in MVP — 把 ViewHolder 的邏輯移到 Presenter 去做吧

Sean Lin
verybuy-dev
Published in
4 min readApr 7, 2018
“Truck near a bridge with an arm and a USA Olymmpic ring tshirt in the window” by Charles Deluvio 🇵🇭🇨🇦 on Unsplash

之前看到了上面這一篇文章裡面寫的蠻有意思的

也解決了我疑惑很久的一件事

傳統上我們在寫 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 給大家參考

可以切換不同的分支看傳統和修改過的寫法

有問題也歡迎來討論啦~

--

--