一个通用RecycleView Adapter

305 阅读1分钟

RegisterAdapter 使用说明

项目地址

1633674749229604.gif 使用方式

1.导入jitpack

maven { url 'https://jitpack.io' }

2.gradle 导入

implementation 'com.gitee.aracoix:register-adapter:1.0.3'

声明adapter val adapter = RegisterAdapter()

3.Gradle中开启viewbinding 或者 databinding

低版本gradle

    dataBinding {
        enabled = true
    }
    viewBinding {
        enabled = true
    }

高版本gradle

    buildFeatures{
        viewBinding = true
        dataBinding = true
    }

使用dataBinding 需要'kotlin-kapt' 支持

3.写一个布局 item_loading_view_holder.xml

 <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:background="@color/white">

        <ImageView
            android:id="@+id/progress"
            android:layout_width="72dp"
            android:layout_height="27dp"
            android:layout_centerInParent="true"
            android:src="@drawable/anim_loading" />

    </RelativeLayout>

4.开始写viewholder

LoadingViewHolder.kt

class LoadingBean

class LoadingViewHolder(override val mBinding: ItemLoadingViewHolderBinding)
:BaseRegisterViewHolder<LoadingBean, ItemLoadingViewHolderBinding>(mBinding) {
    override fun bindData(data: LoadingBean, payloads: List<Any>) {
        (mBinding.progress.drawable as AnimationDrawable).start()
    }
}

FooterViewHolder.kt

data class FooterBean(val desc: Int = R.string.common_list_no_more, val height: Int = 40.dp)
class FooterViewHolder(override val mBinding: ItemFooterViewHolderBinding) :
    BaseRegisterViewHolder<FooterBean, ItemFooterViewHolderBinding>(mBinding) {
    override fun bindData(data: FooterBean, payloads: List<Any>) {
        mBinding.loadingEndText.setText(data.desc)
        val layoutParams = mBinding.llFooter.layoutParams
        layoutParams.height = data.height
        mBinding.llFooter.layoutParams = layoutParams
        addMultiClickListener(mBinding.root)
    }
}

5.绑定adapter,注意holder注册时 按照 bean+binding 为key,如果相同的话只有后注册的生效


recyclerView.layoutManager = LinearLayoutManager(requireContext())
adapter.register(LoadingViewHolder::class.java)
adapter.register(FooterViewHolder::class.java)
//一对多注册
adapter.multiRegister(object : MultiRegister<Bean>() {
                override fun pickItem(position:Int,data: Bean): RegisterItem {
                    return when (data.type) {
                        1 -> RegisterItem(ViewHolderA::class.java)
                        else -> RegisterItem(ViewHolderB::class.java)
                    }
                }
            })
adapter.registerTo(recyclerView)
adapter.loadData(LoadingBean())
adapter.loadData((0..100).map{Bean()})
adapter.loadData(FooterBean())


删除全部数据 adapter.removeAllData()

移除某个数据

      
adapter.removeData(data)
adapter.removeData(index)


另外可 将viewholder 添加到viewgroup 上使用

LoadingViewHolder::class.holder2View(viewgroup,LoadingBean())