Kotlin / Android - получить идентификатор сгенерированной кнопки внутри элемента onBindViewHolder

У меня есть recyclerView с несколькими предметами (ViewHolders). В одном из них (ViewHolderItemTratamentos) я получил следующие элементы:

Kotlin / Android - получить идентификатор сгенерированной кнопки внутри элемента onBindViewHolder

Когда щелкают по первому «добавить button», через макет inflator, те же элементы (editText и button) создаются под предыдущими. Именно так:

Kotlin / Android - получить идентификатор сгенерированной кнопки внутри элемента onBindViewHolder Код из моего adapter (который получил логику установленного щелчка), который создает новую строку:

holder.add_field_button.setOnClickListener {
    holder.parent_linear_layout.apply {
        val inflater = LayoutInflater.from(context)
        val rowView = inflater.inflate(R.layout.used_products_field, this, false)
        holder.parent_linear_layout.addView(rowView, holder.parent_linear_layout.childCount!! - 0)
        holder.add_field_button.text = "-"
     }
  }

Итак, проблема заключается в том, что я не могу получить id от buttonlayout.used_products_field для генерации другой новой строки. Стоит ли раздувать этот макет (есть ли смысл?)? И должен ли я давать один и тот же id каждому button (статическому и сгенерированному)?

Содержимое поля R.layout.used_products_field:

<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:orientation = "horizontal" >
<EditText
    android:id = "@+id/number_edit_text"
    android:layout_width = "0dp"
    android:layout_height = "match_parent"
    android:layout_weight = "5"
    android:inputType = "phone"/>

<Button
    android:id = "@+id/add_field_button"
    android:layout_width = "50dp"
    android:layout_height = "wrap_content"
    android:layout_gravity = "center"
    style = "@style/botaoCard"
    android:textSize = "24dp"
    android:text = "+"
    android:padding = "5dp"/>

Я думаю, если бы у вас всегда была кнопка только visibility = "GONE", у вас не было бы этих проблем

EpicPandaForce 31.12.2018 17:30

@epicPandaForce Может быть, вы не поняли сути. Моя проблема в том, что я не могу получить идентификатор второй кнопки, которая находится внутри другого макета, чем первая.

Pedro Relvas 31.12.2018 17:36

@PedroRelvas У вас есть еще один вопрос, на который вы не принимаете ответ, даже если вы явно используете его в этом новом вопросе, и я имею в виду часть val inflater = LayoutInflater.from(context), см. stackoverflow.com/questions/53981684/…

Omar Mainegra 31.12.2018 17:43

Просто укажите id в R.layout.used_products_field, как обычно, позже вы нажмете кнопку прослушивания holder.parent_linear_layout.findViewById(R.id.button).

Omar Mainegra 31.12.2018 18:32

@OmarMainegra Привет! Простите, вы правы! II не предназначался! Спасибо, что обратили на меня внимание.

Pedro Relvas 31.12.2018 18:34

@OmarMainegra Я пробовал это. Не работает все это. Он не может дотянуться до кнопки.

Pedro Relvas 31.12.2018 18:35

Н.П., выложите содержимое R.layout.used_products_field, чтобы узнать, что вы пытаетесь

Omar Mainegra 31.12.2018 18:38

@OmarMainegra Готово. Я также пробовал другое имя идентификатора по сравнению со статическим.

Pedro Relvas 31.12.2018 18:42
1
8
2 267
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны получить кнопку после добавления ее к родительскому ViewGroup, в вашем случае это блок прослушивателя щелчков по строке.

holder.add_field_button.setOnClickListener {
    holder.parent_linear_layout.apply {
        val inflater = LayoutInflater.from(context)
        val rowView = inflater.inflate(R.layout.used_products_field, this, false)
        addView(rowView, childCount!! - 0) // addView and childCount are available in the scope
        holder.add_field_button.text = "-"

        val button = findViewById<Button>(R.id.add_field_button) // findViewById is available in the scope
    }
}

Привет @OmarMainegra. Проблема в том, что я могу получить идентификатор таким образом, но следующие сгенерированные кнопки не получают действия setOnClickListener. Ты знаешь почему? Спасибо.

Pedro Relvas 01.01.2019 13:36
Ответ принят как подходящий

Вы можете получить виды внутри раздутого макета (used_products_field)

val inflater = LayoutInflater.from(context)
val rowView = inflater.inflate(R.layout.used_products_field, this, false)
val button = rowView.findViewById<Button>(R.id.add_field_button)
val edittext = rowView.findViewById<EditText>(R.id.number_edit_text)

да, но работает только для первой кнопки. Если у меня 16 кнопок, остальные 15 работать не будут ...

Pedro Relvas 01.01.2019 00:06

Другие вопросы по теме