Я хочу создать RecycliewiewAdapter с несколькими макетами в Kotlin, используя DataBinding

Jayanth vn спросил: 28 марта 2018 в 04:14 в: android

Мое требование - установить другой макет, основанный на настройке LayoutManager на recyclerview. Код был выполнен с использованием Kotlin и DataBinding. Я определил getItemViewType () , чтобы установить тип макета, но застрял на части привязки данных. Пожалуйста, помогите мне сделать это.

import android.os.Build
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroupclass WallRecyclerAdapter(private var images: List<Image>, var listener: OnItemClickListener, var type: Int) : RecyclerView.Adapter<WallRecyclerAdapter.WallViewHolder>() {    fun replaceData(items: List<Image>) {
        setupData(items)
    }    private fun setupData(items: List<Image>) {
        this.images = items
        notifyDataSetChanged()
    }    override fun getItemViewType(position: Int): Int {
        return if(type == HomeFragment.RECYCLER_TYPE_GRID){
            R.layout.wall_recycler_item
        }else{
            R.layout.wall_recycler_list_item
        }
    }    override fun onBindViewHolder(holder: WallViewHolder, position: Int) {
        val data = images[position]
        holder.binding.wallpaper = data        holder.binding.maincardcontainer.setOnClickListener({
            listener.onClick(holder.binding.imgRecyclerWallpaper,position,data)
        })
    }    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WallViewHolder {
        val layoutInflater = LayoutInflater.from(parent.context)
        val binding = WallRecyclerItemBinding.inflate(layoutInflater, parent, false)
        return WallViewHolder(binding)
    }    override fun getItemCount(): Int {
        return images.size
    }    interface OnItemClickListener {
        fun onClick(view: View,position: Int, wallpaper : Image)
    }    class WallViewHolder(var binding: WallRecyclerItemBinding) : RecyclerView.ViewHolder(binding.root)
}

1 ответ

Jayanth vn ответил: 30 марта 2018 в 07:06

Согласно ответу @pskink, я изменил свой адаптер и он нормально работал.

class WallRecyclerAdapter(private var images: List<Image>, private var type: Int, var listener: WallRecyclerAdapter.OnItemClickListener) : RecyclerView.Adapt.AutoCompleteViewHolder>() {    fun replaceData(items: List<Image>) {
        setupData(items)
    }    private fun setupData(items: List<Image>) {
        this.images = items
        notifyDataSetChanged()
    }    override fun getItemViewType(position: Int): Int {
        if (type == HomeFragment.RECYCLER_TYPE_LIST) {
            return R.layout.wall_recycler_list_item
        } else if (type == HomeFragment.RECYCLER_TYPE_GRID) {
            return R.layout.wall_recycler_item
        }
        throw RuntimeException("invalid obj")
    }    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AutoCompleteViewHolder {
        return AutoCompleteViewHolder.create(LayoutInflater.from(parent.context), parent, viewType)
    }    override fun onBindViewHolder(holder: AutoCompleteViewHolder, position: Int) {
        holder.bindTo(images[position])
    }    override fun getItemCount(): Int {
        return images.size
    }    class AutoCompleteViewHolder(val binding: ViewDataBinding) : RecyclerView.ViewHolder(binding.root) {        fun bindTo(data: Any) {
            binding.setVariable(BR.Image, data)
            binding.executePendingBindings()
        }        companion object {            fun create(inflater: LayoutInflater, parent: ViewGroup, viewType: Int): AutoCompleteViewHolder {
                val binding = DataBindingUtil.inflate<ViewDataBinding>(inflater, viewType, parent, false)                return AutoCompleteViewHolder(binding)
            }
        }
    }
}