Я следил за this, this и this, чтобы сделать мой ListView лучшими. Собственно, следуя третьей ссылке, я существенно улучшил гладкость прокрутки.Улучшить производительность переустановки ListView
Дело в том, что я использую индивидуальный макет для каждой строки, который содержит 2 ImageViews (один из них неизменный, а второй с двумя возможными назначениями drawables) и два TextViews, поэтому это определение:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/elem_list"
android:orientation="horizontal">
<ImageView
android:id="@+id/chanlist_featured"
android:layout_width="20dp"
android:layout_height="30dp"
android:layout_marginTop="8dp"
android:contentDescription="@string/desc_gen_image"
android:gravity="center" />
<TextView
android:id="@+id/chanlist_chan"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:layout_weight="13"
android:ellipsize="marquee"
android:maxLines="2"
android:padding="10dp" />
<LinearLayout
android:layout_width="40dp"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/chanlist_usercount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingTop="10dp"
android:ellipsize="marquee"
android:gravity="center"
android:maxLines="2"
android:textSize="11sp" />
<ImageView
android:layout_width="10dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingTop="8dp"
android:contentDescription="@string/desc_gen_image"
android:background="@drawable/user" />
</LinearLayout>
</LinearLayout>
Хорошо, никаких проблем до сих пор. Поэтому я определил свой индивидуальный ArrayAdapter метод GetView() которого состоит в следующем:
И здесь возникает проблема: я пытаюсь показать около 300 элементов списка. Как я уже сказал, список прокручивается плавно (и большинство сообщений, которые я нашел об улучшении производительности ListViews, говорят об этом), но время между вызовом инициализации адаптера (новый MyOwnArrayAdapter() ...) и визуализацией список огромен (около 15-20 секунд). Я могу просто приукрасить его, показывая индикатор выполнения, но мне интересно, не делаю ли я что-то неэффективное здесь, поскольку я думаю, что 300 элементов - это не так много.
Любые советы приветствуются!
---------- ---------- EDIT
я в том числе конструктор:
public class StableArrayAdapter<T> extends ArrayAdapter<T> {
final private Context context;
final private int resourceId;
final private List<T> objects;
final Drawable star, star_off;
// There I store the objects to include in the list
final private HashMap<T, Integer> mIdMap = new HashMap<T, Integer>();
// I had to Override some methods related to the observers, that's why I store this
final private ArrayList<DataSetObserver> observers = new ArrayList<DataSetObserver>();
// Constructor
public StableArrayAdapter(final Context context_, final int resourceId_, final List<T> objects_) {
super(context_, resourceId_, objects_);
this.context = context_;
this.resourceId = resourceId_;
this.objects = objects_;
for (int i = 0; i < objects.size(); i++)
mIdMap.put(objects.get(i), i);
star = context.getResources().getDrawable(R.drawable.checkbox_star);
star_off = context.getResources().getDrawable(R.drawable.checkbox_star_down);
}
...
}
Если прокрутка не является проблемой, ваша проблема не в 'getView()'. Он находится в инициализации адаптера. Как вы получаете данные, которые заполняют ListView? Добавьте этот код в свой пост. –
Данные, переданные в StableArrayAdapter(), обрабатываются URL-адресом, который содержит эти 300 элементов.Я не считаю, что это займет время, поскольку это отдельная задача (в фоновом потоке, кстати). Как только я получил эти элементы, я передаю их конструктору, который я редактировал в своем сообщении. – nKn