#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) {
...
...
}
Это работает идеально