Есть ли недостатки в реализации onClickListener для каждой строки ListView вместо onItemClickListener? - PullRequest
3 голосов
/ 14 марта 2012

Для меня было бы удобнее зарегистрировать уникальный OnClickListener для каждой строки в ListView, но я хочу быть уверен, что это приемлемая практика.Мой текущий дизайн - довольно запутанный способ отделить проблемы OnClickListener от каждого типа строк.

Причина этого в том, что в * 1008 есть несколько классов строк*.У каждого класса совершенно разные обязанности и поведение.Например, рассмотрим ListView, который может содержать как подкатегории, так и названия книг.Если щелкнуть название книги, должно начаться новое действие с изображением обложки.Если щелкнуть по подкатегории, отобразится новый список книг и категорий.

Я бы хотел, чтобы сама строка поддерживала знания о своей личности и ответственности, а не утечки знаний о каждой строкедолжен поддерживаться разработчиком onItemClickListener.

Я также хотел бы знать, как это влияет на производительность по сравнению с реализацией моей собственной логики, чтобы выяснить, как обрабатывать щелчок.

Есть ли недостатки в реализации onClickListener для каждой строки ListView ArrayAdapter вместо onItemClickListener?Я ищу конкретные данные и конкретные недостатки , а не расплывчатые рекомендации.

Стоит ли ожидать использование памяти , время инициализации, или установившаяся скорость (например, прокрутка списка), которая будет значительно затронута?

1 Ответ

5 голосов
/ 14 марта 2012

Вы не объясняете, почему вам нужны отдельные прослушиватели кликов для каждой строки, но я бы рекомендовал против этого.Взгляните на использование View.setTag(Object) / View.getTag() для передачи специфичных для строки пользовательских данных, с помощью которых вы можете настроить ответ (общего) прослушивателя щелчков.

EDIT

Я вижу из вашего примера, почему вы хотите, чтобы различные OnClickListener были присоединены к вашим строкам.У меня сложилось впечатление, что вы хотели отдельный экземпляр 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)
    }
}
...