主要使用BaseProviderMultiAdapter,BaseItemProvider实现无限循环,并且能点击button、item、左右无限循环滑动。
Loop2Fragment类
package com.example.androidkotlindemo2.recyclerview.demo5 import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearSnapHelper import com.example.androidkotlindemo2.R import com.example.androidkotlindemo2.bean.Loop2Bean import com.example.androidkotlindemo2.bean.Test1Bean import com.example.androidkotlindemo2.databinding.RecyclerViewLoop2MainBinding import com.example.androidkotlindemo2.recyclerview.provider.Loop2BaseMultiProviderAdapter import com.example.androidkotlindemo2.recyclerview.provider.Loop2Common import com.example.androidkotlindemo2.utils.LogUtils /** * Author : wn * Email : maoning20080809@163.com * Date : 2024/6/1 10:43 * Description : 使用Loop2BaseMultiProviderAdapter实现无限循环 */ class Loop2Fragment : Fragment() { private lateinit var binding : RecyclerViewLoop2MainBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { binding = RecyclerViewLoop2MainBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) var adapter = Loop2BaseMultiProviderAdapter() var data = getData() adapter.data = data var linearLayoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false) var linearSnapHelper = LinearSnapHelper() binding.rvLoop2RecyclerView.let { it.adapter = adapter it.layoutManager = linearLayoutManager linearSnapHelper.attachToRecyclerView(it) //跳转到中间 //it.scrollToPosition(Int.MAX_VALUE/2) //跳转到第1个 it.scrollToPosition((Int.MAX_VALUE - data.size) / 2) } adapter.setOnItemClickListener { adapter, view, position -> LogUtils.e("Loop2Fragment", "1setOnItemClickListener 点击item") } adapter.setOnItemChildClickListener { adapter, view, position -> when(view.id){ R.id.rv_loop2_item_btn -> { LogUtils.e("Loop2Fragment", "2setOnItemChildClickListener 点击按钮") } R.id.rv_loop2_item_root -> { LogUtils.e("Loop2Fragment", "2setOnItemChildClickListener 点击item") } } } } private fun getData() : MutableList<Loop2Bean>{ var imgs = intArrayOf(R.mipmap.base_banner0, R.mipmap.base_banner1, R.mipmap.base_banner2, R.mipmap.base_banner3, R.mipmap.base_banner4, R.mipmap.base_banner5) var list = mutableListOf<Loop2Bean>() for (i in 0 until imgs.size){ //for (i in 0 until 3){ var loop2Bean = Loop2Bean(i, "姓名${i}", "描述${i}", "", imgs[i], Loop2Common.BASE_LOOP2) list.add(loop2Bean) } return list } }
Loop2BaseMultiProviderAdapter类
package com.example.androidkotlindemo2.recyclerview.provider import android.location.GnssClock import android.view.View import com.chad.library.adapter.base.BaseProviderMultiAdapter import com.chad.library.adapter.base.listener.OnItemChildClickListener import com.chad.library.adapter.base.listener.OnItemClickListener import com.chad.library.adapter.base.viewholder.BaseViewHolder import com.example.androidkotlindemo2.R import com.example.androidkotlindemo2.bean.Loop2Bean import com.example.androidkotlindemo2.utils.LogUtils /** * Author : wn * Email : maoning20080809@163.com * Date : 2024/6/1 11:50 * Description : */ class Loop2BaseMultiProviderAdapter : BaseProviderMultiAdapter<Loop2Bean>() { init { addItemProvider(Loop21Provider()) //添加点击事件 addChildClickViewIds(R.id.rv_loop2_item_btn) addChildClickViewIds(R.id.rv_loop2_item_btn_layout) } override fun getItemCount(): Int { return Int.MAX_VALUE } override fun getItem(position: Int): Loop2Bean { var currentPosition = position % data.size return super.getItem(currentPosition) } override fun getItemType(data: List<Loop2Bean>, position: Int): Int { var currentPosition = position % data.size return data[currentPosition].itemViewType } override fun getItemViewType(position: Int): Int { var currentPosition = position % data.size return super.getItemViewType(currentPosition) } override fun convert(holder: BaseViewHolder, item: Loop2Bean) { super.convert(holder, item) } override fun convert(holder: BaseViewHolder, item: Loop2Bean, payloads: List<Any>) { super.convert(holder, item, payloads) } }
Loop21Provider类:
package com.example.androidkotlindemo2.recyclerview.provider import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.AppCompatButton import androidx.constraintlayout.widget.ConstraintLayout import com.chad.library.adapter.base.BaseProviderMultiAdapter import com.chad.library.adapter.base.provider.BaseItemProvider import com.chad.library.adapter.base.viewholder.BaseViewHolder import com.example.androidkotlindemo2.R import com.example.androidkotlindemo2.bean.Loop2Bean import com.example.androidkotlindemo2.bean.Test1Bean import com.example.androidkotlindemo2.utils.LogUtils /** * Author : wn * Email : maoning20080809@163.com * Date : 2024/6/1 11:42 * Description : */ class Loop21Provider : BaseItemProvider<Loop2Bean>() { override val itemViewType: Int get() = Loop2Common.BASE_LOOP2 override val layoutId: Int get() = R.layout.recycler_view_loop2_item override fun getAdapter(): BaseProviderMultiAdapter<Loop2Bean>? { return super.getAdapter() } override fun convert(helper: BaseViewHolder, item: Loop2Bean) { var position = helper.layoutPosition var adapter = getAdapter() var data = adapter?.data var size = data?.size?:1 var currentPosition = position % size LogUtils.i("Loop21Provider", "position : ${helper.layoutPosition}, name : ${item.name}, currentPosition : ${currentPosition}") helper.setText(R.id.rv_loop2_item_name, item.name) helper.setText(R.id.rv_loop2_item_desc, item.desc) helper.setImageResource(R.id.rv_loop2_item_img, item.imgSource) } override fun convert(helper: BaseViewHolder, item: Loop2Bean, payloads: List<Any>) { super.convert(helper, item, payloads) } }
Loop2Bean类:
package com.example.androidkotlindemo2.bean /** * Author : wangning * Email : maoning20080809@163.com * Date : 2024/6/1 10:33 * Description : */ data class Loop2Bean(val index : Int, val name :String, val desc: String, val imgUrl : String, val imgSource : Int, var itemViewType : Int = 0 ) { }
recycler_view_loop2_main.xml布局:
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/rv_loop2_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginVertical="10dp" android:layout_centerHorizontal="true" android:textSize="20sp" android:textColor="@color/red" android:text="使用BaseProviderMultiAdapter实现无限循环" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_loop2_recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/rv_loop2_title" /> </RelativeLayout> </layout>
recycler_view_loop2_item.xml布局
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_marginHorizontal="10dp" android:id="@+id/rv_loop2_item_root" android:layout_width="match_parent" android:layout_height="wrap_content"> <androidx.appcompat.widget.AppCompatImageView android:id="@+id/rv_loop2_item_img" android:layout_width="300dp" android:layout_height="100dp" android:scaleType="centerCrop" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" android:src="@mipmap/demo_farms"/> <androidx.appcompat.widget.AppCompatTextView android:id="@+id/rv_loop2_item_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_marginStart="30dp" app:layout_constraintStart_toStartOf="@+id/rv_loop2_item_img" app:layout_constraintTop_toBottomOf="@+id/rv_loop2_item_img" android:textColor="@color/red" android:textSize="28sp" android:text="名称" /> <androidx.appcompat.widget.AppCompatTextView android:id="@+id/rv_loop2_item_desc" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintStart_toEndOf="@+id/rv_loop2_item_name" app:layout_constraintEnd_toEndOf="@+id/rv_loop2_item_img" app:layout_constraintTop_toTopOf="@+id/rv_loop2_item_name" android:textColor="@color/blue" android:textSize="28sp" android:text="描述" /> <androidx.appcompat.widget.AppCompatButton android:id="@+id/rv_loop2_item_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintStart_toEndOf="@+id/rv_loop2_item_desc" app:layout_constraintEnd_toEndOf="@+id/rv_loop2_item_img" app:layout_constraintTop_toTopOf="@+id/rv_loop2_item_desc" android:textColor="@color/black" android:textSize="28sp" android:text="按钮" /> <View android:id="@+id/rv_loop2_item_btn_layout" android:layout_width="1dp" android:layout_height="1dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toBottomOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout>