OnClickListeners не последовательно стрелял - PullRequest
2 голосов
/ 30 октября 2011

У меня есть просмотр списка, где каждый элемент списка может содержать 1 или более кликабельных изображений.Нажатие на них запускает действие, которое показывает полноэкранную версию изображения.

Следующий код (слегка упрощенный) устанавливает OnClickListeners в моей реализации GetView() для каждого изображения в каждом ListItem.Это сработало идеально.

ImageView imageView = (ImageView)convertView.findViewById(R.id.image_res);
imageView.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        ActivityLauncher.startPhotoViewerActivity(mContext, item);
    }
});

Однако для повышения производительности я решил сохранить каждое представление в памяти после его создания в первый раз.Я делаю это вместо использования convertView, поскольку существует 4-5 различных типов представлений, и они иногда динамически создаются в коде, что затрудняет повторное использование.

Как только я начинаю хранить представления в памятии затем возвращая уже построенные представления во время последующих вызовов на getView() на основе позиции, производительность значительно улучшается, но OnClickListeners начинает вести себя неуклюже.

В частности, теперь, когда происходит прикосновение к данному изображению, OnClickListener ибо оно может сработать немедленно или вообще не сработать.В тех случаях, когда он не срабатывает сразу, он может срабатывать, как только начинается прокрутка.Если это не запускает OnClickListener для запуска, щелчок назад (для выхода из действия) может вызвать его.Если это не сработает, закрытие всех действий нажатием НАЗАД) и повторный вход в приложение вызовут все очереди OnClickListeners.В одном случае я нажимал 25 раз на разные изображения безрезультатно.Затем я закрыл все действия и затем снова щелкнул значок приложения, что открыло все 25 предварительных просмотров изображений.

Есть идеи относительно того, что вызывает это?Что меня интересует, так это то, что OnClickListeners, очевидно, установлены правильно, потому что они действительно открывают активность просмотра фотографий в определенный момент времени.Неправильное изображение никогда не открывается, и никогда не бывает случаев, когда они НИКОГДА не стреляют.Проблема в том, что они могут срабатывать немедленно или намного позже.

Не рекомендуется ли сохранять представления для каждого элемента списка и возвращать их в зависимости от положения из getView(), как я делаю?Любая помощь с благодарностью.

1 Ответ

3 голосов
/ 31 октября 2011

Смотрите выступление на ListViews, данное в Google I / O. В 13:45 они специально предостерегают от кеширования представлений и их возврата. Если кто-то это делает, это может привести к странному поведению, которое я и испытываю. Учитывая это, вопрос спорный.

http://www.youtube.com/watch?v=wDBM6wVEO70

Надеюсь, что это поможет кому-то в будущем избежать тех же ошибок. Кэширование просмотров НЕ РЕКОМЕНДУЕТСЯ !!!

...