Как загрузить Listview «плавно» в android

Я загружаю данные из Cursor в listview, но в моем Listview не отображается «плавный». Данные меняются при перетаскивании вверх и вниз на панели scollbar в моем ListView. И некоторые элементы выглядят как дублированный дисплей в моем списке. Я hava «сложный ListView» (два textview, oneviewview). Поэтому я использовал newView (), bindView () для отображения данных. Кто-нибудь может мне помочь?

ListView – хитрый зверь.

Второй вопрос: вы видите дубликаты, потому что ListView повторно использует Views через convertView, но вы не уверены, чтобы сбросить все аспекты преобразованного представления. Убедитесь, что путь кода для convertView!=null правильно задает все данные для представления, и все должно работать должным образом.

Вы хотите, чтобы ваш getView() выглядел примерно следующим образом, если вы используете пользовательские представления:

 @Override public View getView(int position, View convertView, ViewGroup parent) { final MyCustomView v = convertView!=null ? (MyCustomView)convertView : new MyCustomView(); v.setMyData( listAdapter.get(position) ); return v; } 

Если вы не используете свое собственное пользовательское представление, просто замените вызов на new MyCustomView() вызовом на inflater.inflate(R.layout.my_layout,null)

Что касается вашего первого вопроса, вам нужно посмотреть техническую информацию Romain на производительность ListView здесь: http://code.google.com/events/io/sessions/TurboChargeUiAndroidFast.html

Из его беседы и в порядке важности из моего собственного опыта,

  • Использовать convertView
  • Если у вас есть изображения, не масштабируйте свои изображения на лету. Используйте Bitmap.createScaledBitmap для создания масштабированного растрового изображения и поместите его в свои представления
  • Используйте ViewHolder, поэтому вам не нужно каждый раз называть группу findViewByIds ()
  • Уменьшите сложность просмотров в списке. Чем меньше подпунктов, тем лучше. RelativeLayout намного лучше, чем, скажем, LinearLayout. И обязательно используйте, если вы реализуете пользовательские представления.

Я столкнулся с этой проблемой, но в моем случае я использовал streamи для получения внешних изображений. Важно, чтобы текущий исполняемый stream не менял imageView, если он используется повторно!

 public View getView(int position, View vi, ViewGroup parent) { ViewHolder holder; String imageUrl = ...; if (vi == null) { vi = inflater.inflate(R.layout.tweet, null); holder = new ViewHolder(); holder.image = (ImageView) vi.findViewById(R.id.row_img); ... vi.setTag(holder); } else { holder = (ViewHolder) vi.getTag(); } holder.image.setTag(imageUrl); ... DRAW_MANAGER.fetchDrawableOnThread(imageUrl, holder.image); } 

И затем на выборку я делаю важную проверку :

 final Handler handler = new Handler() { @Override public void handleMessage(Message message) { // VERY IMPORTANT CHECK if (urlString.equals(url)) imageView.setImageDrawable((Drawable) message.obj); }; Thread thread = new Thread() { @Override public void run() { Drawable drawable = fetchDrawable(urlString); if (drawable != null) { Message message = handler.obtainMessage(1, drawable); handler.sendMessage(message); } }}; thread.start(); 

Можно также отменить текущий stream, если их представление повторно используется (как описано здесь ), но я решил против этого, потому что я хочу заполнить свой кеш для последующего повторного использования.

Только один совет: НИКОГДА не используйте прозрачный фон макета элемента – он значительно замедляет производительность

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

  • Как я могу просмотреть перечисление Java из его значения String?
  • android: listview в списке
  • Еще один getView вызвал несколько раз
  • Элемент списка ListView с помощью настраиваемого селектора
  • Как обновить список просмотров Android?
  • ListView пуст при использовании функции getFilter
  • Как сделать дополнительный просмотр float в UICollectionView в виде заголовков секций в обычном стиле UITableView
  • Условный список itemtemplate или datatemplate в WPF
  • Android - в чем смысл StableID?
  • ASP.NET MVC - просмотр с несколькими моделями
  • ListView setOnItemClickListener не работает, добавив кнопку
  • Interesting Posts

    Могу ли я выполнить одноразовый поиск содержимого файла в Windows Server 2008 без добавления папки в индекс?

    Соединение остается помеченным как ESTABLISHED, даже если хост не подключен

    Переустановка окон в многодисковой системе, что делать с дисководом?

    Как RequireJS работает с несколькими страницами и частичными представлениями?

    Любой способ ссылки на настройки уведомлений Android для моего приложения?

    Должны ли каждая таблица иметь первичный ключ?

    Ошибка PostgreSQL ‘Не удалось подключиться к серверу: нет такого файла или каталога’

    Выбрать несколько изображений из галереи Android

    Как избежать специальных символов, например, в sqlite в android

    Linux: сравнение структуры каталогов без сравнения файлов

    Как очистить предыдущие ожидания от объекта?

    Как удалить элемент массива в mongodb?

    Удаление одного файла из корзины в Mac OS X Snow Leopard

    WPF – включение гиперссылок

    AES совместимость между .Net и iPhone?

    Давайте будем гением компьютера.