Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
#1

Скрытие элемента ListView - Программирование Android

04.11.2014, 14:03. Просмотров 1701. Ответов 23
Метки нет (Все метки)

Заполняю своим адаптером, унаследованным от BaseAdapter. В качестве item использую свой класс который имеет поле isEnable - если оно равно false вместо нормальной строки возвращает в список new View();. При нажатии на элемент назначаю isEnable = false и вызываю adapter.notifyDataSetChanged(). Отрабатывает все отлично, да вот приложение подвисает примерно на секунду. Писал логи при нажатии на элемент - все операции выполняются за 5-7 миллисекунд. Что это может быть и как не вешать ui? Пробовал даже в AsyncTask все выносить - результат тот же. Есть какие нибудь идеи как заставить это работать быстро?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2014, 14:03     Скрытие элемента ListView
Посмотрите здесь:

Замена элемента в ListView - Программирование Android
Доброго времени суток, форумчане! Столкнулся с проблемой есть ListView у которого все элементы это TextView, как запрограммировать чтобы...

выделение элемента в ListView - Программирование Android
Подскажите, что я делаю не так? У меня в кастомном диалоге создается и заполняется список, при его отображении необходимо чтоб по умолчанию...

Зафиксировать пзицию элемента в ListView - Программирование Android
Коллеги, нужен совет. Ситуация такая - Есть один ListView, элементом списка является WebView. Так вот, после иницализации адаптера нужно...

Клик по айтему элемента ListView - Программирование Android
Добрый день товарищи. Есть необходимость отследить нажатие на элемент элемента ListView, извиняюсь за тавтологию. Вот пока лишь...

ListView не работает выбор элемента - Программирование Android
Доброго времени суток. Который день мучаюсь. Не знаю как поменять цвет ListView, так что бы не сбить работу выбора элемента при нажатии....

Оформление элемента списка ListView - Программирование Android
Здравствуйте. Подскажите, как можно добиться результата, показанного на рисунке 1 (это в Paint подрисовано :) ) У меня сейчас выглядит...

Переход с элемента listView на activity - Программирование Android
никак не возьму в толк, каким образом можно реализовать переход на новое activity с элемента listView, чтобы при нажатии на 1 строку...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
04.11.2014, 14:14     Скрытие элемента ListView #2
Spelcrawler, как обычно, просим привести хотя бы проблемный кусочек кода. Я отказался от AsyncTask при заполнении адаптера, потому что если пользователь будет несколько раз подряд нажимать на кнопочку, то предыдущее заполнение не успеет отработать, начнётся следующее, которое будет иметь доступ к той же коллекции (массиву) и вызовет исключение, что обращаться можно только в ui-потоке.
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
04.11.2014, 15:04  [ТС]     Скрытие элемента ListView #3
CoolMind, Кусок кода чего?) Вот что в онклик происходит:
Java
1
2
3
4
5
6
7
8
9
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
               
                Log.d("TAG", "startClick");
                Item item = items.get(position);
                item.setEnable(false);
                adapter.notifyDataSetChanged();
                Log.d("TAG", "allDone");
 
            }
И вот из адаптера заполнение:
Java
1
2
3
4
5
6
7
8
9
10
 public View getView(int i, View convertView, ViewGroup viewGroup) {
 
        Item item = getItem(i);
        if(item.isEnable()){
            return viewHolder.getLine(item);
        }else{
            return new View(context);
        }
 
    }
Добавлено через 25 минут
Может есть какой то совершенно другой путь? Или может библиотека какая то которая позволяет скрывать элементы. Или вообще все это засунуть в ScrollView? Чем вообще плох ScrollView для отображения списков?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
04.11.2014, 16:12     Скрытие элемента ListView #4
Spelcrawler, я не понял, на какой элемент происходит щелчок, в коде вы не описали. Как происходит заполнение адаптера? Всю ли функцию getView вы написали? Что такое getItem? Несколько раз писал свои адаптеры, но не припомню, что такое new View(context). Пока не могу помочь вам, потому что все проекты на работе.
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
04.11.2014, 16:15  [ТС]     Скрытие элемента ListView #5
Цитата Сообщение от CoolMind Посмотреть сообщение
я не понял, на какой элемент происходит щелчок, в коде вы не описали.
Да на любой.
Цитата Сообщение от CoolMind Посмотреть сообщение
Всю ли функцию getView вы написали?
да
Цитата Сообщение от CoolMind Посмотреть сообщение
Что такое getItem?
стандартный метод BaseAdapter'a
Цитата Сообщение от CoolMind Посмотреть сообщение
Несколько раз писал свои адаптеры, но не припомню, что такое new View(context).
Это пустая вьюшка
Цитата Сообщение от Spelcrawler Посмотреть сообщение
В качестве item использую свой класс который имеет поле isEnable - если оно равно false вместо нормальной строки возвращает в список new View();
Gabberr
102 / 102 / 17
Регистрация: 13.10.2009
Сообщений: 403
05.11.2014, 10:45     Скрытие элемента ListView #6
не нужно каждый раз создавать новую вьюху, просто управляйте видимостью текущего элемента.
Что-то типа этого:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
 
                View view;
                if(convertView != null){
                   view  = convertView;
                }else{
                    view = viewHolder.getLine(item);
                }
                if(getItem(position).isEnable()){
                         view.setVisivility(View.VISIBLE);
                }else{
                         view.setVisivility(View.INVISIBLE);
                }
    return view;
}
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
05.11.2014, 11:34  [ТС]     Скрытие элемента ListView #7
Gabberr, Не работает такое в ListView. Точнее работает, но не так как ожидается. Сама вьюшка исчезает, да, но вот на ее месте остается пустое место. Делал visibility = GONE. Сейчас решил вообще свой виджет для списков написать, на основе обычного ScrollView, пока все работает быстрее чем с ListView и памяти ест меньше. Отсюда вопрос - почему принято использовать ListView, если ScrollView удобнее, проще в реализации, быстрее работает и намного более гибок? И еще вопрос в этом моем виджете при открытии отображается 10 элементов, остальные подгружаются асинхронно но мере готовности (с сетью работы нет и ничего особо тяжелого тоже, но так отрисовывается мгновенно). Дак вот если поменять высоту элемента во время подгрузки новых элементов - она меняется отлично, НО если поменять ее когда все элементы добавлены - ничего не происходит. Что это такое? Может ли это быть из-за того что мой список находится в диалоге?
Gabberr
102 / 102 / 17
Регистрация: 13.10.2009
Сообщений: 403
05.11.2014, 11:46     Скрытие элемента ListView #8
Вот про отличия
http://stackoverflow.com/questions/9...w-and-listview
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
05.11.2014, 11:55  [ТС]     Скрытие элемента ListView #9
То есть, насколько я понял, разница лишь в том что ListView "заточен" под работу с данными и переводом их в изображение? То есть подразумевается, что работа с данными в ListView удобнее, чем в ScrollView? Я правильно понимаю? И если я напишу свой интерпретатор данных в изображение - разницы никакой?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
05.11.2014, 15:14     Скрытие элемента ListView #10
Spelcrawler, насколько я понял из указанной ссылки, поведения ScrollView и ListView достаточно сильно отличаются. Вообще, честно говоря, не думал, что одно может заменить другое.
Во-первых, элементы этих двух компонентов могут быть разными. Для ListView свойственно хранение одинаковых элементов, в ScrollView можно хранить совершенно разные вещи (не коллекции).
Во-вторых, ListView экономит память и не хранит все View сразу, а только ту часть, которую отображает.
В-третьих, ListView удачно работает с адаптерами, что позволяет проще работать с данными (и базами данных).
Пока не сравнивал по скорости, но выигрыш должен быть у ListView.
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
05.11.2014, 16:03  [ТС]     Скрытие элемента ListView #11
CoolMind, это все так. Но во-первых: разница в потребляемой памяти не заметна (у меня ScrollView отъел меньше, чем ListView прокрученный быстро от начала до конца и обратно), если элементов около 100 или менее. Во-вторых при большом весе картинок в элементах ListView он подтормаживает при прокрутке. В-третьих: мне намного удобнее работать со ScrollView, при его использовании с каждым элементом можно творить что угодно, а вот в ListView все работает не так как ожидаешь увидеть. Теперь именно к моей задаче) У меня список из примерно 100-120 элементов и в основном всегда присутствуют одни и те же элементы, но в разном порядке и иногда некоторые нужно скрывать. Какой минус я заметил при переходе на ListView дак это только время отрисовки, но эту проблему решил асинхронным добавлением элементов. Теперь отрисовка даже быстрее чем с ListView, элементы скрываются мгновенно, скролл очень быстрый и плавный (разве что при начальном добавлении элементов тормозит примерно как на ListView при первой прокрутке, но все элементы добавляются примерно за секунду-полторы так-что не критично) и процессор не гоняю каждый раз при скролле. Дак вот теперь повторю вопрос - почему не принято использовать в случаях, подобных моему, ScrollView?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
05.11.2014, 16:17     Скрытие элемента ListView #12
Spelcrawler, да, это всё интересно. А как вы выполняете фильтрацию элементов по подстроке?

Добавлено через 5 минут
Точнее говоря, это делается средствами адаптера. Вопрос в том, как вы подсоединяете адаптер к ScrollView.
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
05.11.2014, 17:06  [ТС]     Скрытие элемента ListView #13
Цитата Сообщение от CoolMind Посмотреть сообщение
А как вы выполняете фильтрацию элементов по подстроке?
Не совсем понял что это такое.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
05.11.2014, 18:04     Скрытие элемента ListView #14
Spelcrawler, не могу сходу найти пример. Вот здесь кусочек есть (не совсем правильный): http://www.survivingwithandroid.com/...ilter-and.html
В общем, у вас есть ListView, в нём записи, например, список городов. Вы набираете в отдельном поле буквы "Ко", при этом в списке остаются Ковров, Коломна, Кострома и т.п. При этом перезаписывать список в адаптер не надо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2014, 18:11     Скрытие элемента ListView
Еще ссылки по теме:

ListView: подсветка выбранного элемента - Программирование Android
В активити есть несколько списков со своей разметкой. Пересмотрел кучу примеров, но у самого что-то не получается оставить после нажатия...

ListView ячейки, получить Id элемента из SQLite - Программирование Android
есть база данных SQLITE. некоторые элементы БД выводятся в ListView через адаптер и вспомогательный XML. моя задача - в onItemClick перейти...

Сохранение position элемента ListView при поиске - Программирование Android
Если можно подробно описать и показать пример кода не посредственно показывающего сохранение позиции конкретного элемента ListView. т.к....

Listview, adapter получение информации из нажатого элемента списка - Программирование Android
Есть список, который заполняется из базы данных. Мне нужно через контекстное меню удалить этот элемент из списка и исходя из информации,...

Переход на новое activity с элемента listView, заполненного через SimpleCursorAdapter - Программирование Android
Здравствуйте! Помогите разобраться с такой проблемой: Есть список listView, который получает данные из БД через SimpleCursorAdapter. По...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
05.11.2014, 18:11  [ТС]     Скрытие элемента ListView #15
Можно добавить поиск по строке, если не содержит строку - скрывать.
Yandex
Объявления
05.11.2014, 18:11     Скрытие элемента ListView
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru