Adapter和ViewHolder解耦

为什么要解耦

  • 可维护性:将 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 专注于持有视图引用和处理简单的视图逻辑,从而实现职责的明确分离。

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值