android recyclerview多布局

314 阅读1分钟

1.MyAdapter

class MyAdapter<T:Any>(private val context: Context, private val data: MutableList<T>,private val views: MutableList<out View> = mutableListOf()) :
    RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    //定义viewholder
    class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val name: TextView = itemView.findViewById(R.id.name)
        val hobby: TextView = itemView.findViewById(R.id.hobby)
    }

    class MyViewHolder1(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val name: TextView = itemView.findViewById(R.id.name)
    }

    class MyViewHolder2(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val name: TextView = itemView.findViewById(R.id.name)
        val hobby: TextView = itemView.findViewById(R.id.hobby)
    }

    //创建viewholder
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return when (viewType) {
            10 -> MyViewHolder(
                LayoutInflater.from(context)
                    .inflate(R.layout.rv_item, parent, false)
            )
            11 -> MyViewHolder1(
                LayoutInflater.from(context)
                    .inflate(R.layout.rv_item1, parent, false)
            )
            12 -> MyViewHolder2(
                LayoutInflater.from(context)
                    .inflate(R.layout.rv_item2, parent, false)
            )
            else -> MyViewHolder(
                LayoutInflater.from(context)
                    .inflate(R.layout.rv_item, parent, false)
            )
        }
    }

//可以用data(position)
    override fun getItemViewType(position: Int): Int {
        return when (position % 3) {
            0 -> 10
            1 -> 11
            2 -> 12
            else -> 10
        }
    }

    override fun getItemCount(): Int {
        return data.size
    }

    //绑定viewholder
    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        when (holder) {
            is MyViewHolder -> {
                holder.name.text = data[position].toString()
                holder.hobby.text = "666"
                holder.itemView.setOnClickListener {
                    Toast.makeText(
                        context,
                        "itemview点击$position",
                        Toast.LENGTH_SHORT
                    ).show()
                    (views[0] as TextView).text = "不用回调也可以的"
                }
                holder.name.setOnClickListener {
                    Toast.makeText(
                        context,
                        "name点击$position",
                        Toast.LENGTH_SHORT
                    ).show()
                }
                holder.hobby.setOnClickListener {
                    data.remove(data[position])
                    notifyDataSetChanged()
                }
            }
            is MyViewHolder1 -> {
                holder.name.text = data[position].toString()
                holder.itemView.setOnClickListener {
                    Toast.makeText(
                        context,
                        "itemview点击$position",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }
            is MyViewHolder2 -> {
                holder.name.text = data[position].toString()
                holder.hobby.text = "666"
                holder.itemView.setOnClickListener {
                    Toast.makeText(
                        context,
                        "itemview点击$position",
                        Toast.LENGTH_SHORT
                    ).show()
                }
                holder.name.setOnClickListener {
                    Toast.makeText(
                        context,
                        "name点击$position",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }
        }
    }
}

2.MainActivity

class MainActivity : AppCompatActivity() {
    //adapter中数据变化-->传入数据变化
    private val datalist =
        mutableListOf<String>("666", "888", "xiyanyan", "666", "888", "xiyanyan")
    private val madapter: MyAdapter by lazy {
        MyAdapter(this, datalist, mutableListOf(title_tv))
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        custom_title.setTittle("nihao")
        custom_title.setLeftOnClickListener {
            Toast.makeText(this,"datalist.size=${datalist.size}",Toast.LENGTH_SHORT).show()
        }
        //span列
        //recycler.layoutManager = GridLayoutManager(this,2)
        recycler.layoutManager = LinearLayoutManager(this)
        recycler.adapter = madapter

        button.setOnClickListener {
            datalist.remove("xiyanyan")
            madapter.notifyDataSetChanged()
        }
    }
}

3.备注

android:overScrollMode="never"
委托模式:by lazy(单例)持有引用,委托给引用