Производительность Listview

Рейтинг: 1Ответов: 2Опубликовано: 11.02.2015

Здравствуйте!

Я хотел бы задать вопрос по поводу производительности Listview. У меня есть приложение, в котором присутсвует листвью. В нем содержится 700-800 элементов. При скроллинге приложение тормозит. Я прочитал про патерн Viewholder и реализовал его, чтобы улучшить производительность. Но, к сожалению, это не помогло. При прокрутке листвью также тормозило. Как с этим бороться? Скажем, у меня на телефоне стоит плеер, в котором тоже наверняка используется листвью, и в этом плеере у меня около тысячи песен, и список прокручивается без единого тормоза. Как подобное можно реализовать? К сожалению, код адаптера показать пока не могу (добавлю, если нужно, позже).

Разметка элемента листвью выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/artistText" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/titleText" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/durationText" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:text="@string/synchedSongCaption"       
        android:id="@+id/synchedText" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"        
        android:id="@+id/progressText" />
    <CheckBox
        android:id="@+id/toDownloadSong"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <ProgressBar
        android:id="@+id/downloadProgress"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"       
        style="?android:attr/progressBarStyleHorizontal"
        android:max="100"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="30dp" />  
    <Button 
        android:id="@+id/contextMenuButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />"
</LinearLayout>

UPD

вот здесь код адаптера

Ответы

▲ 1

Попробуйте поменять ListView на RecyclerView. Он совместим со старыми API. Там, как говорит гугол всё быстрее работает.

Ну или подгружать элементы в список по мере прокрутки. Одним из множества endless scrolling ListView

▲ 1

Скорее всего основные тормоза находятся в куске:

 Audio song = getModel(position);

Советую реализовать примерно следующую штуку:

  1. Песенки кэшировать/складывать в БД SQLitе
  2. Над SQLite организовать чтение через CursorLoader
  3. А собственно выдергивание песенок (Audio) из Cursor вынести в AsyncTask

В результате будет следующее - загрузка списка будет мгновенное, далее по ходу отработки AsyncTaskа из SQLite ListView будет потихоньку один за одним показывать ваши песенки: имя артиста, название и проч. инфу.