Проверьте, какой ImageView был нажат внутри ListView

#android

Вопрос:

У меня есть ListView, который работает с шаблонами пользовательских элементов.

Внутри шаблона элемента списка находятся ImageViews (используемые в качестве кнопок) и несколько строк. Данные привязаны к CustomAdapter.

Я хочу делать определенные вещи внутри ListView с каждым элементом при нажатии на разные ImageViews.

Я родом из .NET и WebDevelopment и очень новое в Android.

Как я могу добиться проверки того, какая кнопка или изображение, в котором был нажат ListItem.

Обычно я бы дал каждому элементу в пользовательском атрибуте ListItem с уникальным идентификатором, включая ключ из элемента данных, и получил этот ключ в событии нажатия кнопки и так далее.

Есть ли какое-либо мнение о том, чтобы присвоить ImageView пользовательский атрибут типа ‘MyCustomID’ и получить его в событии щелчка из него? Или каков обычный рабочий процесс для подобной ситуации: ListItems с повторяющимися элементами и проверка того, какой ListItem принадлежит выбранному элементу внутри.

Пожалуйста, помогите!

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

1. поскольку есть ответ, я могу дать рекомендацию о хороших методах, поскольку вы новичок в Android; используйте RecyclerView вместо ListView и ImageButton вместо ImageView в качестве кнопки.

Ответ №1:

Попробуйте с этим

 listView.setOnItemClickListener(new OnItemClickListener() {

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
   //  position is the index of clicked item.
   
}
 

});

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

1. Большое спасибо. Но при такой реализации каждый элемент в ListView запускает это событие, не так ли? Мне нужны разные методы для разных элементов внутри ListItem

Ответ №2:

Прежде всего, я бы рекомендовал перейти на RecyclerView. Он более производительный, гибкий и простой в использовании. Здесь вы можете проверить, как это сделать.

О вашем вопросе: я точно не помню, как реализовать ListView, но я полагаю, что у вас есть адаптер. В этом адаптере вы создаете представление своих элементов. Итак, что вы можете сделать, это создать интерфейс прослушивателя, который получает информацию о ваших элементах. Что-то вроде:

 interface OnImageItemClickListener {
    fun onImageClicked(imageInfo: ImageInfo)
}

data class ImageInfo(
    val id: Long,
    val uri: URI,
)
 

Затем вы можете передать реализацию этого интерфейса своему адаптеру, а затем использовать его в View.setOnClickListener методе:

 class CustomAdapter(
    private val listener: OnImageItemClickListener,
    private val info: List<ImageInfo>,
) : ... {
    override getView(position: Int, convertView: View, parent: ViewGroup): View {
        // Inflate your view...
        view.setOnClickListener {
            listener.onImageClicked(info[position])
        }
    }
}
 

Опять же, я настоятельно рекомендую перейти на RecyclerView. Если вы это реализуете, вам придется выполнить те же шаги.

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

1. Спасибо за ваш совет с RecyclerView, я собираюсь изменить это и попробовать ваш подход