为什么要解耦
- 可维护性:将 ViewHolder 从 Adapter 中分离出来,可以使每个类的职责更加单一和明确,提升代码的可维护性。
- 复用性:如果 ViewHolder 的逻辑变得复杂,你可以在不同的 Adapter 中重用相同的 ViewHolder。
- 清晰性:清晰地分离视图绑定和数据适配的逻辑,使代码更易于理解。
package com.example.migame.game
import com.example.migame.dto.MiGameInfo
interface OnGameItemClickListener {
fun onGameItemClick(item: MiGameInfo)
}
ViewHolder类:只负责视图的绑定和点击事件的处理。
package com.example.migame.game
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.example.migame.R
import com.example.migame.dto.MiGameInfo
class GameViewHolder(itemView: View, private val itemClickListener: OnGameItemClickListener) : RecyclerView.ViewHolder(itemView) {
private val gameImage: ImageView = itemView.findViewById(R.id.game_image)
private val gameName: TextView = itemView.findViewById(R.id.game_name)
fun bind(gameInfo: MiGameInfo) {
gameName.text = gameInfo.gameName
Glide.with(itemView.context)
.load(gameInfo.icon)
.into(gameImage)
itemView.setOnClickListener {
itemClickListener.onGameItemClick(gameInfo)
}
}
}
Adapter 的主要职责是将数据与 RecyclerView 的每个 ViewHolder 绑定在一起。它负责管理数据集合,并根据数据的变化更新视图。
package com.example.migame.game
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.migame.R
import com.example.migame.dto.MiGameInfo
class BottomGameAdapter(
private val gameList: List<MiGameInfo>,
private val itemClickListener: OnGameItemClickListener
) : RecyclerView.Adapter<GameViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GameViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(R.layout.item_top_game, parent, false)
return GameViewHolder(itemView, itemClickListener)
}
override fun onBindViewHolder(holder: GameViewHolder, position: Int) {
holder.bind(gameList[position])
}
override fun getItemCount() = gameList.size
}
Acitivty或者Fragment
// onCreateView
// 下半部分的RecyclerView
val bottomRecyclerView = view.findViewById<RecyclerView>(R.id.bottom_recycler_view)
bottomRecyclerView.layoutManager = StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL)
viewLifecycleOwner.lifecycleScope.launch {
val bottomGames = getBottomGames()
// 更新UI
bottomGames?.let { games ->
bottomRecyclerView.adapter = BottomGameAdapter(games,this@GameFragment)
} ?: run {
// showError()
}
}
override fun onGameItemClick(item: MiGameInfo) {
Log.d("TAG", "onItemClick: ")
}
解耦以后可以确保 Adapter 专注于数据和视图的绑定,而 ViewHolder 专注于持有视图引用和处理简单的视图逻辑,从而实现职责的明确分离。