在嵌套 Recyclerview 中选择父项目时的子选择(单选)

问题描述 投票:0回答:0

需求就像我如何跟踪父项被选中,子项可以相应地被选中。但在我的情况下,无需选择我想要限制的父项目子项。我正在使用 Nested 在 Recyclerview 中显示父项和子项,例如酒店是父项目,根据酒店,房间正在子 Recyclerview 中列出。 浏览附件以获得更好的可见性

父 RecyclerView

class HotelAdapter(private val context: Context, private var selectedHotelID: Int, private val interaction: Interaction) :
    RecyclerView.Adapter<HotelAdapter.NavigationOptionViewHolder>(),HotelRoomAdapter.Interaction {

    var selectedItemPos = -1
    var lastItemSelectedPos = -1

    private val viewPool = RecyclerView.RecycledViewPool()

    private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<Hotel>() {

        override fun areItemsTheSame(
            oldItem: Hotel,
            newItem: Hotel
        ): Boolean {
            return oldItem.hotelName == newItem.hotelName
        }

        override fun areContentsTheSame(
            oldItem: Hotel,
            newItem: Hotel
        ): Boolean {
            return oldItem.equals(newItem)
        }
    }

    private val differ = AsyncListDiffer(this, DIFF_CALLBACK)

    /**
     * Interface for any kind of listener event in recyclerView
     * */
    interface Interaction {
        fun onItemHotelSelected(position: Int, item: Hotel)
    }

    class NavigationOptionViewHolder(
        val itemDataBindingUtil: RowHotelSelectionBinding,
        val interaction: Interaction
    ) :
        RecyclerView.ViewHolder(itemDataBindingUtil.root)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NavigationOptionViewHolder {
        val itemDatabinding = DataBindingUtil.inflate<RowHotelSelectionBinding>(LayoutInflater.from(parent.context),
                R.layout.row_hotel_selection, parent, false)
        return NavigationOptionViewHolder(
            itemDatabinding,
            interaction
        )
    }

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

    fun submitList(list: List<Hotel>) {
        differ.submitList(list)
    }

    override fun onBindViewHolder(holder: NavigationOptionViewHolder, position: Int) {
        var item = differ.currentList[position]
        holder.itemDataBindingUtil.navigationItem = item
        holder.itemDataBindingUtil.clickEvent = interaction
        holder.itemDataBindingUtil.position = position
        holder.itemDataBindingUtil.mRadioButton.setOnCheckedChangeListener(null)

        if(selectedHotelID == item.hotelId) {
            selectedItemPos = position
            lastItemSelectedPos = position
        }

        if(position == selectedItemPos) {
            holder.itemDataBindingUtil.mRadioButton.isChecked = true
            holder.itemDataBindingUtil.container.setBackgroundResource(R.color.colorAccent)
        } else {
            holder.itemDataBindingUtil.mRadioButton.isChecked = false
            holder.itemDataBindingUtil.container.setBackgroundResource(R.color.white)
        }

        holder.itemDataBindingUtil.mRadioButton.setOnCheckedChangeListener { _, _ ->
            selectedItemPos = position
            selectedHotelID = item.hotelId
            lastItemSelectedPos = if(lastItemSelectedPos == -1)
                selectedItemPos
            else {
                notifyItemChanged(lastItemSelectedPos)
                selectedItemPos
            }
            notifyItemChanged(selectedItemPos)
        }

        holder.itemDataBindingUtil.hotelBanner.load(item?.hotelImages?.get(0)) {
            scale(Scale.FILL)
        }

        holder.itemDataBindingUtil.roomListView.apply {
            Toast.makeText(context,selectedItemPos.toString(),Toast.LENGTH_SHORT).show()
            layoutManager = LinearLayoutManager(holder.itemDataBindingUtil.roomListView.context, LinearLayoutManager.VERTICAL, false)
            adapter = HotelRoomAdapter(context,item.rooms, this@HotelAdapter, selectedItemPos)
            holder.itemDataBindingUtil.roomListView.setRecycledViewPool(viewPool)
        }
    }

    class ViewHolder(
        val itemDataBindingUtil: RowHotelSelectionBinding,
        val interaction: Interaction
    ) :
        RecyclerView.ViewHolder(itemDataBindingUtil.root)

    override fun onRoomSelected(position: Int, item: Room) {
        Toast.makeText(context,item.roomName,Toast.LENGTH_SHORT).show()
    }
}

Room Adapter

class HotelRoomAdapter(private val context: Context, private val children: List<Room>,
                       private val interaction: Interaction,private val parentSelectedItemPos: Int) :
    RecyclerView.Adapter<HotelRoomAdapter.NavigationOptionViewHolder>() {

    var selectedItemPos = -1
    var currentItemSelected: Int = 0
    var lastItemSelectedPos = -1

    private val viewPool = RecyclerView.RecycledViewPool()

    private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<Room>() {

        override fun areItemsTheSame(
            oldItem: Room,
            newItem: Room
        ): Boolean {
            return oldItem.roomName == newItem.roomName
        }

        override fun areContentsTheSame(
            oldItem: Room,
            newItem: Room
        ): Boolean {
            return oldItem == newItem
        }
    }

    private val differ = AsyncListDiffer(this, DIFF_CALLBACK)

    /**
     * Interface for any kind of listener event in recyclerView
     * */
    interface Interaction {
        fun onRoomSelected(position: Int, item: Room)
    }

    class NavigationOptionViewHolder(
        val itemDataBindingUtil: RowRoomSelectionBinding,
        val interaction: Interaction
    ) :
        RecyclerView.ViewHolder(itemDataBindingUtil.root)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NavigationOptionViewHolder {
        val itemDatabinding = DataBindingUtil.inflate<RowRoomSelectionBinding>(LayoutInflater.from(parent.context),
            R.layout.row_room_selection, parent, false)
        return NavigationOptionViewHolder(
            itemDatabinding,
            interaction
        )
    }

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

    fun submitList(list: List<Room>) {
        differ.submitList(list)
    }

    override fun onBindViewHolder(holder: NavigationOptionViewHolder, position: Int) {
        val item = children[position]
        holder.itemDataBindingUtil.navigationItem = item
        holder.itemDataBindingUtil.clickEvent = interaction
        holder.itemDataBindingUtil.position = position

        val list: List<String> = listOf(*item.roomFacility.split(",").toTypedArray())
        if(list.isNotEmpty()){
            val buttonLayoutParams = LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT
            )
            holder.itemDataBindingUtil.vContainer.removeAllViews()
            buttonLayoutParams.setMargins(5, 5, 5, 5)
            for (i in list.indices) {
                val tv = TextView(context)
                tv.text = list[i]
                tv.height = 80
                tv.textSize = 8.0f
                tv.gravity = Gravity.CENTER
                tv.setTextColor(Color.parseColor("#000000"))
                tv.background = context.resources.getDrawable(R.drawable.rounded_corner_yellow)
                tv.id = i + 1
                tv.layoutParams = buttonLayoutParams
                tv.tag = i
                tv.setPadding(10, 10, 10, 10)
                holder.itemDataBindingUtil.vContainer.addView(tv)
            }
        }

        holder.itemDataBindingUtil.mSelectRoom.setOnCheckedChangeListener(null)

        if(position == selectedItemPos) {
            holder.itemDataBindingUtil.mSelectRoom.isChecked = true
            holder.itemDataBindingUtil.container.setBackgroundResource(R.color.colorAccent)
        }
        else {
            holder.itemDataBindingUtil.mSelectRoom.isChecked = false
            holder.itemDataBindingUtil.container.setBackgroundResource(R.color.gray)
        }

        holder.itemDataBindingUtil.mSelectRoom.setOnCheckedChangeListener { _, _ ->
            selectedItemPos = position
            lastItemSelectedPos = if(lastItemSelectedPos == -1)
                selectedItemPos
            else {
                notifyItemChanged(lastItemSelectedPos)
                selectedItemPos
            }
            notifyItemChanged(selectedItemPos)
        }

    }
}
android kotlin android-recyclerview nestedrecyclerview
© www.soinside.com 2019 - 2024. All rights reserved.