<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      優勢:

      1、適配器通用,無論針對什么列表樣式

      2、viewholder分離,業務邏輯拆分到具體的item

      3、復用性擴展性更強

      首先看viewholder,沒有復雜的業務邏輯

      open class BaseViewHolder(val mBinding: ViewBinding) : RecyclerView.ViewHolder(mBinding.root) {
      
          fun setClick(clickRoot: View, clickListener: ((Int) -> Unit)?) {
              AnimatorUtil.pressView(
                  clickRoot, Runnable { clickListener?.invoke(bindingAdapterPosition) }
              )
              clickRoot.setOnClickListener { clickListener?.invoke(bindingAdapterPosition) }
          }
      
      }
      View Code

      適配器想要通用,就不能有業務邏輯,需要解耦

      import android.view.ViewGroup
      import androidx.recyclerview.widget.RecyclerView
      import com.zeekr.screensaver.home.holder.ScreenMainHolderFactory
      
      /**
       * @author liuzhen
       * 多類型適配器
       * */
      open class BaseAdapter : RecyclerView.Adapter<BaseViewHolder>() {
      
          var itemClickListener: ((Int) -> Unit)? = null
          private val list = mutableListOf<IBaseItem>()
      
          override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
              ScreenMainHolderFactory.onCreateViewHolder(parent, viewType, itemClickListener)
      
          override fun getItemCount() = list.size
      
          fun getItem(position: Int) = list[position]
      
          fun getItems() = list
      
          override fun getItemViewType(position: Int) = getItem(position).itemType.value
      
          override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
              getItem(position).bind(holder, position)
          }
      
          override fun onBindViewHolder(holder: BaseViewHolder, position: Int, payloads: List<Any?>) {
              getItem(position).bind(holder, position, payloads)
          }
      
          fun setItems(newList: MutableList<IBaseItem>) {
              list.clear()
              list.addAll(newList)
          }
      
      }
      View Code

      可以看到,簡化了viewholder跟adapter,那么邏輯去哪了,在bean的上面加了一層item,可以把這個bean看成是item

      首先需要定義一個接口,從adapter中看到所有數據類型都是 IBaseItem

      import com.zeekr.screensaver.home.holder.ViewType
      
      interface IBaseItem {
      
          val itemType: ViewType
      
          var isShowShimmer: Boolean
      
          fun bind(holder: BaseViewHolder, position: Int, payloads: List<Any?>? = null)
      
      }
      View Code

      多類型安全,最好使用枚舉

      enum class ViewType(val value: Int) {
          TITLE(1), ITEM(2), BANNER(3), ME_ADD(4), ME_ITEM(5);
      
          companion object {
              fun fromValue(value: Int) = values().firstOrNull { it.value == value }
          }
      }
      View Code

      統一管理ViewHolder

      object ScreenMainHolderFactory {
      
          @JvmStatic
          fun onCreateViewHolder(
              parent: ViewGroup,
              viewType: Int,
              itemClickListener: ((Int) -> Unit)?
          ): BaseViewHolder {
              val inflater = LayoutInflater.from(parent.context)
              return when (ViewType.fromValue(viewType)) {
                  ViewType.TITLE -> BaseViewHolder(
                      ItemMainSubTitleBinding.inflate(inflater, parent, false)
                  )
      
                  ViewType.BANNER -> BaseViewHolder(
                      ItemMainBannerBinding.inflate(inflater, parent, false)
                  )
      
                  ViewType.ME_ADD -> {
                      val binding = ItemMeAddBinding.inflate(inflater, parent, false)
                      BaseViewHolder(binding).also {
                          it.setClick(binding.root, itemClickListener)
                      }
                  }
      
                  ViewType.ME_ITEM -> {
                      val binding = ItemMePhotoCardBinding.inflate(inflater, parent, false)
                      BaseViewHolder(binding).also {
                          it.setClick(binding.clRoot, itemClickListener)
                      }
                  }
      
                  else -> {
                      val binding = ItemMainPhotoCardBinding.inflate(inflater, parent, false)
                      BaseViewHolder(binding).also {
                          it.setClick(binding.clRoot, itemClickListener)
                      }
                  }
              }
          }
      
      }
      View Code

      viewholder中的邏輯解耦到了item類中,先定義接口IBaseItem 

      import com.zeekr.screensaver.home.holder.ViewType
      
      interface IBaseItem {
      
          val itemType: ViewType
      
          var isShowShimmer: Boolean
      
          fun bind(holder: BaseViewHolder, position: Int, payloads: List<Any?>? = null)
      
      }
      View Code

      結合viewbinding,實現接口

      import androidx.viewbinding.ViewBinding
      import com.zeekr.screensaver.home.holder.ViewType
      
      abstract class BaseBindItem<V : ViewBinding>(val viewType: ViewType) : IBaseItem {
      
          override val itemType = viewType
          override var isShowShimmer = true
      
          abstract fun onBindViewHolder(position: Int, mBinding: V)
      
          open fun onBindViewHolder(position: Int, mBinding: V, payloads: List<Any?>) {}
      
          override fun bind(holder: BaseViewHolder, position: Int, payloads: List<Any?>?) {
              @Suppress("UNCHECKED_CAST")
              val binding = holder.mBinding as V
              if (payloads.isNullOrEmpty()) {
                  onBindViewHolder(position, binding)
              } else {
                  onBindViewHolder(position, binding, payloads)
              }
          }
      
      }
      View Code

      這樣,已經根據多類型封裝好了,只要根據視圖,創建類型item,直接將viewholder的業務轉移到了item中

      比如新建一個banner類型

      class MainBannerItem(
          private val list: List<ScreenItemBean>
      ) : BaseBindItem<ItemMainBannerBinding>(ViewType.BANNER) {
      
          override fun onBindViewHolder(position: Int, mBinding: ItemMainBannerBinding) {
              mBinding.apply {
                  if (isShowShimmer) bannerPage.onClear()
                  bannerPage.start(list, bannerCarousel)
                  groupContent.isInvisible = isShowShimmer
                  shimmerView.isVisible = isShowShimmer
                  shimmerView.setImageResource(R.drawable.icon_main_banner_loading)
                  if (isShowShimmer) shimmerView.startShimmer() else shimmerView.stopShimmer()
              }
          }
      
      }
      View Code

      在新建一個卡片類型

      class MePhotoCardItem(var bean: ScreenItemBean, private val currentId: Int) :
          BaseBindItem<ItemMePhotoCardBinding>(ViewType.ME_ITEM) {
      
          override fun onBindViewHolder(position: Int, mBinding: ItemMePhotoCardBinding) {
              mBinding.apply {
                  tvTitle.text = bean.getTitle()
                  tvTitle.setPXTextSize(R.dimen.common_sp_32)
                  tvTitle.setExtTextColor(R.color.main_card_title_color)
                  if (bean.isCustom()) {
                      GlideCacheUtils.getInstance(root.context).glideLoadPicturePath(
                          bean.customBitmap, ivPhoto
                      )
                  } else {
                      GlideCacheUtils.getInstance(root.context).loadHomeItemUrl(bean.getUrl(), ivPhoto)
                  }
                  linSuite.isVisible = bean.isCabin()
                  linSuite.setExtBackground(R.drawable.shape_item_main_card_suite)
                  ivPhotoSuite.setExtSrc(R.drawable.icon_main_card_photo_suite)
                  tvSuiteTitle.setPXTextSize(R.dimen.common_sp_20)
                  tvSuiteTitle.setExtTextColor(R.color.main_card_title_suite_color)
                  groupMask.isInvisible = bean.getTitle()?.isEmpty() == true
                  ivCheck.isVisible = bean.isCheck(currentId)
                  clRoot.isInvisible = isShowShimmer
                  shimmerView.isVisible = isShowShimmer
                  shimmerView.setImageResource(R.drawable.icon_main_photo_card_loading)
                  if (isShowShimmer) shimmerView.startShimmer() else shimmerView.stopShimmer()
              }
          }
      
      }
      View Code

      可以觀察到,它其實充當bean的角色,又是獨立的item

      在創建一個特殊的自定義功能卡片類型

      class MeAddItem(@MeAddItemType val type: Int) : BaseBindItem<ItemMeAddBinding>(ViewType.ME_ADD) {
      
          companion object {
              const val TYPE_AI = 0
              const val TYPE_PHOTO = 1
      
              @IntDef(TYPE_AI, TYPE_PHOTO)
              @Retention(AnnotationRetention.SOURCE)
              annotation class MeAddItemType
          }
      
          override fun onBindViewHolder(position: Int, mBinding: ItemMeAddBinding) {
              mBinding.apply {
                  when (type) {
                      TYPE_AI -> ivPhoto.setImageResource(R.drawable.icon_me_card_ai)
                      else -> ivPhoto.setImageResource(R.drawable.icon_me_card_photo)
                  }
              }
          }
      
      }
      View Code

      隨意擴展

      而adapter的使用更加簡單

      private val mAdapter = BaseAdapter()
      init {
              val inflater = LayoutInflater.from(context)
              mBinding = LayoutScreenRecyclerBinding.inflate(inflater, this, true).apply {
                  recyclerView.adapter = mAdapter
                  recyclerView.layoutManager = ScreenMainGridManager(mAdapter, context)
                  recyclerView.addItemDecoration(ScreenMainItemDecoration())
              }
      }
      
          private fun loadData() {
              LogUtil.d(tag, "loadData")
              lifecycleScope.launch(Dispatchers.Main) {
                  val items = withContext(Dispatchers.IO) {
                      val data = LocalResourceManager.getHistorySuits()
                      val items = mutableListOf<IBaseItem>()
                      items.add(MeAddItem(MeAddItem.TYPE_AI))
                      items.add(MeAddItem(MeAddItem.TYPE_PHOTO))
                      items.add(MainSubTitleItem(MainSubTitleItem.HISTORY))
                      data.map { items.add(MePhotoCardItem(ScreenItemBean(suit = it), currentId)) }
                      items
                  }
                  setItems(items)
              }
          }
      
          private fun loadData(list: List<TestBean>) {
              mBinding.root.isVisible = true
              val items = mutableListOf<IBaseItem>()
              list.forEach {
                  items.addAll(it.map { MainPhotoCardItem(it) })
              }
              mAdapter.setItems(items)
          }
      View Code

      只要是基于RecyclerView,都不需要另外創建adapter,只需要新建你的類型視圖,而adapter跟viewholder完全不用修改,一站式復用

      局部刷新

      override fun onBindViewHolder(position: Int, mBinding: ItemMainPhotoCardBinding) {
              mBinding.apply {
                  tvTitle.text = bean.getTitle()
                  updateProgress(this)
              }
          }
      
          private fun updateProgress(mBinding: ItemMainPhotoCardBinding) {
              mBinding.apply {
                  ivDown.isVisible = !bean.isLocal && bean.progress <= 0
                  progress.isVisible = bean.progress > 0
                  progress.setProgressValue(bean.progress)
              }
          }
      
          override fun onBindViewHolder(
              position: Int,
              mBinding: ItemMainPhotoCardBinding,
              payloads: List<Any?>
          ) {
              when (payloads[0]) {
                  PAYLOAD_PROGRESS_TYPE -> updateProgress(mBinding)
              }
          }
      View Code

      自定義Decoration

      class ScreenMainItemDecoration : RecyclerView.ItemDecoration() {
      
          private val bottomSideMargin =
              Utils.getApp().resources.getDimensionPixelOffset(R.dimen.common_dp_128)
      
          override fun getItemOffsets(
              outRect: Rect,
              view: View,
              parent: RecyclerView,
              state: RecyclerView.State
          ) {
              val position = parent.getChildAdapterPosition(view)
              val count = parent.adapter?.itemCount ?: 0
              val isLastItem = position == count - 1
              outRect.bottom = if (isLastItem) bottomSideMargin else 0
          }
      }
      View Code

       

      posted on 2025-07-01 14:58  翻滾的咸魚  閱讀(26)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 久久久精品2019中文字幕之3| 久久综合色之久久综合色| 亚洲日韩av无码一区二区三区人| 日本夜爽爽一区二区三区| 人妻精品动漫H无码中字| 亚洲国产高清第一第二区 | 国产av麻豆mag剧集| 国产av综合一区二区三区| 一区二区三区四区自拍视频 | 国产日韩精品一区在线不卡| 欧美日韩国产亚洲沙发| 国产三级精品三级| 制服丝袜美腿一区二区| 狠狠人妻久久久久久综合蜜桃| 2021国产成人精品久久| 两个人看的www免费视频中文| 色成人精品免费视频| 少妇激情一区二区三区视频 | 日本亚洲欧洲免费无线码| 一本精品99久久精品77| 男女啪啪高潮激烈免费版| 婷婷丁香五月六月综合激情啪| 亚洲成av人在线播放无码| 中日韩精品视频一区二区三区| 亚洲精品中文av在线| 日韩无矿砖一线二线卡乱| 日韩中文字幕av有码| 黑人好猛厉害爽受不了好大撑| 熟女人妻aⅴ一区二区三区电影| 亚洲欧洲一区二区福利片| 日本三级香港三级三级人!妇久| 日韩精品一区二区三区久| 日韩精品有码中文字幕| 欧美乱大交xxxxx疯狂俱乐部| 石原莉奈日韩一区二区三区| 亚洲色大成成人网站久久| 人妻丝袜AV中文系列先锋影音| 国产亚洲亚洲国产一二区| 免费无码又爽又刺激高潮虎虎视频 | 不卡乱辈伦在线看中文字幕| 伊人久久大香线蕉综合网|