При выборе элемента снимите выделение со всех остальных для группы ie RecyclerView - PullRequest
0 голосов
/ 02 августа 2020

Я вижу, что этот вопрос задают несколько раз, но, возможно, из-за того, что я использую библиотеку Group ie для добавления элементов в свой адаптер, я не могу отменить выбор других элементов, когда один из них выбран ( аналогично функциональности радиокнопки). Я пытаюсь уведомить адаптер об изменениях и немного узнать положение выбранного элемента, но я думаю, что мне все еще может что-то не хватать, если кто-то может указать мне на это, пожалуйста.

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)


    rvOptions.layoutManager = LinearLayoutManager(activity)
    adapter = GroupAdapter()
    rvOptions.adapter = adapter


    viewModel = ViewModelProviders.of(activity as MainActivity).get(TestViewModel::class.java)
    val myViewModel = ViewModelProvider(
        this, MyViewModelFactoryForHashMap(arguments?.getString("headerText"))
    ).get(TestViewModel::class.java)

    myViewModel.userMutableLiveData.observe(this, userListUpdateObserver)

}


private val userListUpdateObserver: Observer<Array<ModelTest>?> =
    Observer { userArrayList ->
        for (s in userArrayList!!) {
            adapter.add(
                RecyclerDialogOptionsItem(
                    activity as MainActivity,
                    s.title,
                    s.selected!!,
                    this@MyDialogFragment
                )
            )
        }
    }

override fun onClickItem( position: Int) {

    adapter.notifyDataSetChanged()
}

}

И вот мой адаптер, так что идея заключается в том, что когда один из элементов находится в выбранном состоянии, связанный с ним imageView будет видимым, а для всех остальных станет невидимым.

class RecyclerDialogOptionsItem(
private val activity: MainActivity,
private val title: String?,
private var selected: Boolean,
private val adapterListener: AdapterListener
) : Item<GroupieViewHolder>() {

companion object {
    var clickListener: AdapterListener? = null
}


override fun bind(viewHolder: GroupieViewHolder, position: Int) {

    var selected_position = -1;

    viewHolder.apply {

        with(viewHolder.itemView) {

            tvTitle.text = title

            clickListener = adapterListener

            itemView.setOnClickListener {

                clickListener?.onClickItem(adapterPosition)


                selected = true

                selected_position = position
                if (selected) {

                    ivChecked.visible()

                } else {
                    ivChecked.invisible()
                }

            }


        }

        selected_position = adapterPosition
        
    }

}


override fun getLayout() = R.layout.rv_options_item_row


interface AdapterListener {
    fun onClickItem(position: Int)
}

}

Большое спасибо.

1 Ответ

2 голосов
/ 03 августа 2020

Первый вариант: создайте свой адаптер и создайте локальную переменную в адаптере и проверьте, выбрано ли положение, что это переменная.

Второй вариант: создайте переменную в Activity под названием selected_position. Когда функция onClickItem вызывает обновление этой переменной и уведомляет об изменении адаптера. в вашем элементе проверьте переменную в действии, например:

// Activity
selected_position = -1

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)


    rvOptions.layoutManager = LinearLayoutManager(activity)
    adapter = GroupAdapter()
    rvOptions.adapter = adapter


    viewModel = ViewModelProviders.of(activity as MainActivity).get(TestViewModel::class.java)
    val myViewModel = ViewModelProvider(
        this, MyViewModelFactoryForHashMap(arguments?.getString("headerText"))
    ).get(TestViewModel::class.java)

    myViewModel.userMutableLiveData.observe(this, userListUpdateObserver)

}


private val userListUpdateObserver: Observer<Array<ModelTest>?> =
    Observer { userArrayList ->
        for (s in userArrayList!!) {
            adapter.add(
                RecyclerDialogOptionsItem(
                    activity as MainActivity,
                    s.title,
                    s.selected!!,
                    this@MyDialogFragment
                )
            )
        }
    }

override fun onClickItem( position: Int) {
    selected_position = position
    adapter.notifyDataSetChanged()
}

}
// Item

class RecyclerDialogOptionsItem(
private val activity: MainActivity,
private val title: String?,
private var selected: Boolean,
private val adapterListener: AdapterListener
) : Item<GroupieViewHolder>() {

companion object {
    var clickListener: AdapterListener? = null
}


override fun bind(viewHolder: GroupieViewHolder, position: Int) {


    viewHolder.apply {

        with(viewHolder.itemView) {

            tvTitle.text = title

            clickListener = adapterListener
            if (activity.selected_position == position) {
                    ivChecked.visible()

                } else {
                    ivChecked.invisible()
                }

            itemView.setOnClickListener {
                clickListener?.onClickItem(adapterPosition)

            }


        }

        
    }

}


override fun getLayout() = R.layout.rv_options_item_row


interface AdapterListener {
    fun onClickItem(position: Int)
}

}
...