Есть ли недостатки при реализации onClickListener для каждой строки ListView вместо onItemClickListener?

StackOverflow https://stackoverflow.com//questions/9708208

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

РЕДАКТИРОВАТЬ

Я вижу из вашего примера, почему вы хотите другого OnClickListeners прикреплен к вашим строкам.У меня сложилось впечатление, что вы хотели отдельного 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)
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top