Как настроить прослушиватель для адаптера RecyclerView? - PullRequest
0 голосов
/ 07 ноября 2018

На моем MainActivity есть Button и RecyclerView с адаптером для CheckedTextView.

Я хочу включить Button при нажатии на CheckedTextView.

Мне удалось добиться этого, установив Button context в static, но это не очень хорошо (утечка памяти и т. Д.)

Я пытался получить кнопку от context и включить ее в simpleCheckedTextView.setOnClickListener:

class AndroidDeviceAdapter(internal var context: Context, private val devices: Array<String>) :
    RecyclerView.Adapter<AndroidDeviceAdapter.MyViewHolder>() {

    inner class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        ...
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        ...
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        ...

        holder.simpleCheckedTextView.setOnClickListener {

        // Getting exception
        (context as Activity).findViewById<Button>(order_button).isEnabled = true
        }
    }

Как лучше всего активировать Button? Можно ли установить слушателя на RecyclerView?

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Пожалуйста, попробуйте следующее.

(context as OrderActivity).order_button.isEnabled = true

Предполагая, что order_button является переменной в вашем OrderActivity.

0 голосов
/ 07 ноября 2018

Вы можете определить интерфейс внутри AndroidDeviceAdapter следующим образом:

interface MyCheckedTextListener {
    fun onCheckedTextClicked()
}

Вместо параметра Context конструктор адаптера должен принимать параметр MyCheckedTextListener:

class AndroidDeviceAdapter(internal var checkedTextListener: MyCheckedTextListener,
     private val devices: Array<String>) : RecyclerView.Adapter<MyListAdapter.MyViewHolder>()

При создании экземпляра адаптера Activity должен передаваться экземпляр MyCheckedTextListener.

Адаптер уведомит Activity через этот экземпляр:

override fun onBindViewHolder(holder: MyViewHolder?, position: Int) {
    holder?.simpleCheckedTextView?.setOnClickListener {
        checkedTextListener.onCheckedTextClicked()
    }
}

Таким образом, Activity может установить новое состояние ButtonButton может оставаться private и не static)

0 голосов
/ 07 ноября 2018

Да, это возможно. Вы можете создать собственный интерфейс, например так:

public interface RecyclerViewClickListener {
    void recyclerViewItemClicked(View view, int position);
}

и внутри вашего адаптера:

class AndroidDeviceAdapter(internal var context: Context, private val devices: Array<String>) :
    RecyclerView.Adapter<AndroidDeviceAdapter.MyViewHolder>() {

   ...
   private RecyclerViewClickListener recyclerViewClickListener;
   ...

   public void setRecyclerViewClickListener(RecyclerViewClickListener recyclerViewClickListener)
   {
   this.recyclerViewClickListener=recyclerViewClickListener;
   }
   ...

А затем добавить прослушиватель щелчка элемента:

 holder.simpleCheckedTextView.setOnClickListener {

        recyclerViewClickListener.recyclerViewItemClicked(holder.simpleCheckedTextView, getAdapterPosition());
        }

А затем присоедините слушателя к упражнению, в котором вы хотите выполнить желаемое действие.

Некоторые из моих фрагментов выполнены в стиле Java. где-то в сочетании с вашим кодом Kotlin. Не забудьте отсортировать, пожалуйста, и адаптировать его к kotlin. Хорошее кодирование

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...