我跟着this,this和this使我的ListView具有儘可能最好的性能。實際上,在第三條鏈接之後,我大大提高了滾動的平滑度。提高ListView賦值的性能
問題是我爲每行包含2個ImageViews(其中一個不變,第二個有兩個可能的繪圖分配)和兩個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個元素不是那麼多。
任何意見讚賞!
---------- ----------編輯
我包括構造:
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()的數據解析了一個具有這300個項目定義的URL。我不計算這需要的時間,因爲它是一個單獨的任務(在後臺線程,順便說一句)。一旦我得到這些項目,我將它們傳遞給我在我的帖子中編輯的構造函數。 – nKn