Есть ли недостатки при реализации onClickListener для каждой строки ListView вместо onItemClickListener?
-
14-12-2019 - |
Вопрос
Мне было бы удобнее зарегистрировать уникальный OnClickListener
для каждой строки в ListView
, но я хочу быть уверен, что это приемлемая практика.Мой текущий дизайн представляет собой довольно запутанный способ разделить проблемы OnClickListener
из каждого типа строки.
Причина этого в том, что у меня есть несколько классов строк в ListView
.У каждого класса совершенно разные обязанности и поведение.Например, рассмотрим ListView
который может содержать как подкатегории, так и названия книг.Если щелкнуть название книги, должно начаться новое действие, в котором отображается изображение обложки.Если щелкнуть подкатегорию, отобразится новый список книг и категорий.
Я бы хотел, чтобы сама строка сохраняла знания о своей личности и ответственности, вместо того, чтобы упускать информацию о каждой строке, которая должна поддерживаться разработчиком onItemClickListener
.
Я также хотел бы знать, каковы последствия этого для производительности по сравнению среализуя свою собственную логику, чтобы выяснить, как обрабатывать щелчок.
Есть ли недостатки в реализации onClickListener
для каждого ListView
ArrayAdapter
ряд вместо onItemClickListener
?Я ищу конкретные данные и конкретные недостатки а не расплывчатые рекомендации.
Должен ли я ожидать использование памяти, время инициализации, или установившаяся скорость (например, прокрутка списка) существенно пострадает?
Решение
Вы не объясняете, зачем вам нужны отдельные прослушиватели кликов для каждой строки, но я бы не рекомендовал этого делать.Взгляните на использование View.setTag(Object)
/View.getTag()
для передачи пользовательских данных для конкретной строки, с помощью которых вы можете настроить ответ (общего) прослушивателя кликов.
РЕДАКТИРОВАТЬ
Я вижу из вашего примера, почему вы хотите другого OnClickListener
s прикреплен к вашим строкам.У меня сложилось впечатление, что вы хотели отдельного OnClickListener
экземпляр для каждой строки.(Это была моя основная причина, по которой я не рекомендовал этого делать.) Если у вас есть два типа строк (категории и заголовки) и сотни строк, вам нужны только два типа ответов, а не сотни их.Я также понимаю смысл разделения задач.
Тем не менее, я думаю, что переопределение ListActivity.onListItemClick()
(или позвонить ListView.setOnItemClickListener()
если вы не используете ListActivity
) будет чище и с меньшей вероятностью будет мешать работе представления списка.Для этого вы можете использовать шаблон делегата следующим образом.
Определите абстрактный класс или интерфейс:
public interface MyClickHandler {
public void onItemClick(ListView l, View v, int position, long id);
}
Затем создайте по одному экземпляру объекта, реализующего этот интерфейс, для каждого тип данных строк (не по одному экземпляру для каждой строки).В вашем адаптере используйте setTag(Object)
инициализировать тег для каждой строки соответствующим MyClickHander
пример.В вашей ListActivity.onListItemClick()
переопределить, используйте эту логику:
protected void onListItemClick(ListView l, View v, int position, long id) {
Object tag = v.getTag();
if (tag instanceof MyClickHandler) {
((MyClickHandler) tag).onItemClick(l, v, position, id);
} else {
// default processing (if any)
}
}