Как использовать setOnClickListener в программном представлении прокрутки Android Kotlin

#android #kotlin #scrollview #onclicklistener

Вопрос:

Я создал scrollView программный файл, содержащий 20 представлений, каждое из которых содержит изображение и текст.

У меня есть два вопроса :

1 — правильно ли присвоение идентификатора и setOnClickListener правильно ли я?

2 — Каким способом onClick я могу узнать, на какое представление scrollView пользователя нажал?

Смотрите мой код ниже

 private var integerList: MutableList<Int>? = mutableListOf()
private var cellNo: MutableList<String>? = mutableListOf()
private var sv_mvmtChoosed = ""

private fun showSpinner() {
    /* SCROllL VIEW */
    var linearLayout: LinearLayout? = null
    linearLayout = findViewById(R.id.linear1)
    val layoutInflater = LayoutInflater.from(this)

    var randIndex = 0
    for (posIndex in 0..19) {
        val rand = Random()
        randIndex = rand.nextInt(20)

        while (integerList!!.contains(randIndex)) {
            randIndex = rand.nextInt(20)
        }
        integerList!!.add(randIndex)

        // Create the view...
        val view: View = layoutInflater.inflate(R.layout.scroll_bckgrnd, linearLayout, false)

        // give it an id
        view.id = generateViewId()
        view.setOnClickListener(this)
        cellNo!!.add(view.id.toString())
        println(cellNo)

        //... then populate it with image and text
        val iv = view.findViewById<ImageView>(R.id.iv)
        iv.setImageResource(sv_photoImage[randIndex])
        val tv = view.findViewById<TextView>(R.id.tv)
        tv.text = sv_photoName[randIndex]
        linearLayout?.addView(view)

    }

    // which view the user did select?
    fun onClick(view: View?) {
        when (view!!.id) {
            ??? -> doSomething
            }

        }
    }
 

Любая идея вернуть меня в нужное русло будет приветствоваться.

Комментарии:

1. Вы можете измениться view.id или Добавьте ТЕГ для просмотра. вы можете поместить сообщение в качестве тега. По тегу вы можете получить позицию элемента при нажатии. Или вы можете получить расположение вида в линейной компоновке.

Ответ №1:

Вероятно, лучше создавать новый OnClickListener для каждого вида.

 view.setOnClickListener(this)
 

должно быть так

 view.setOnClickListener {
    // do something
}
 

или

 view.setOnClickListener(createOnClickListner())

fun createOnClickListner():View.OnClickListener{
    return object :View.OnClickListener{
        override fun onClick(view : View) {
            //do something with the view that was clicked
        }


    }
}
 

Ответ №2:

Большое спасибо, авалерио. Наконец я нашел следующее решение : я заменил :

 // give it an id
    view.id = generateViewId()
    view.setOnClickListener(this)
    cellNo!!.add(view.id.toString())
    println(cellNo)
 

с :

 // give it an id
    view.id = posIndex
    view.setOnClickListener(this)
 

затем я сделал это :

 // the onClickListener for my 20 images/text
        override fun onClick(view: View?) {
            when (view!!.id) {
            // Now de position clicked on the ScrollView
            in 0..19 -> didHeSucceeded(view!!.id)
            }
        }
           
 

И используйте полученный результат:

 private fun didHeSucceeded(scrllPos: Int) {
   // TODO: close de scrollView, how ? :-)
    
   spinnerChoice = nameOfTechScrollVw[scrllPos]
   succes = (!allreadyChoosedArray.contains(spinnerChoice)) amp;amp; (currentArray.contains(spinnerChoice
            ))
   if (succes) {
      ...
      ...
}
 

Это работает идеально