因?yàn)橛辛薓VVM, 有了其中的ViewModel, 所有的列表控件邏輯都可以放到view層(主要)和viewmodel層(輔助)
也因此可以把RecyclerView中的ViewHolder角色消減掉. 因?yàn)閂iewHolder的作用也就是給各個(gè)控件賦值, 設(shè)置事件處理器, 判斷控件是否顯示, 等等, 這完全是View層和ViewModel的職責(zé).
所以就有了本文的這個(gè)優(yōu)化的Adapter.
interface Data {
val itemViewType: Int
val data:Any // 主ViewModel
val params:HashMap<Int, Any> // 附加viewmodel, 當(dāng)一個(gè)布局文件中有多個(gè)viewmodel時(shí)可以使用
}
// 這個(gè)是最終提交給Adapter的數(shù)據(jù)元素封裝類, 里面包含了具體的數(shù)據(jù)對(duì)象data,
// 和布局資源id: itemViewType
class FLData(override val data: Any, override val itemViewType: Int,
override val params: HashMap<Int, Any> = hashMapOf()) : Data
// 這個(gè)就是設(shè)置給RecyclerView控件的adapter類
class MvvmAdapter(
val context: Context, diffCallback: DiffUtilItemCallback<Data> = DefaultDataDiffCallback()
) : ListAdapter<Data, MvvmAdapter.ViewHolder>(diffCallback) {
// 支持多種ItemViewType, 注意這里實(shí)際是直接使用布局文件資源id作為ItemViewType
override fun getItemViewType(position: Int): Int {
return getItem(position).itemViewType
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(
DataBindingUtil.inflate(
LayoutInflater.from(parent.context),
viewType, parent, false
)
)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
var data = getItem(position)
holder.bind(data)
}
// 這就是退化后的ViewHolder, 只賦值為xml設(shè)置viewmodel對(duì)象而已.
class ViewHolder(
private val binding: ViewDataBinding
) : RecyclerView.ViewHolder(binding.root) {
fun bind(data: Data) {
with(binding) {
setVariable(BR.viewModel, data.data)
data.params?.entries.forEach {
(key, value)-> binding!!.setVariable(key, value)
}
executePendingBindings()
}
}
}
}
使用時(shí), 在fragment或者activity中
val binding = DataBindingUtil.inflate<FollowListFragmentBinding>(
inflater, R.layout.follow_list_fragment, container, false)
val viewModel = ViewModelProviders.of(this)
.get(FollowTopicListViewModel::class.java)
binding.viewModel = viewModel
val adapter = MvvmAdapter(requireContext())
binding.followTopicList.adapter =adapter
簡(jiǎn)單來說, 對(duì)于Recyclerview, 再也不考慮在代碼層實(shí)現(xiàn)一個(gè)ViewHolder, 這對(duì)于UI元素類別特別多的項(xiàng)目非常有意義, 可以減少大量重復(fù)的ViewHolder樣式代碼.