2010-10-20 25 views
0

我正在編程構建一個ListView,它的寬度爲FILL_PARENT,高度爲WRAP_CONTENT,然後居中放在其父視圖中。Android ListView Laggy和子視圖縮小

的ListView的是半透明的,以便它後面的活性是可見的,所以我使用:

list.setCacheColorHint(0);
list.setBackgroundColor(Color.argb(200,0,0,0));

除此之外,它是一個完全標準的開箱即用的ListView。

兩個問題:

A)滾動(即使只有幾個孩子)時ListView控件是非常laggy。爲什麼,我該如何優化它? B)每當列表滾動時,ListView中包含的一些子視圖會隨機收縮和擴展,看起來很糟糕。有時候他們會陷入狹隘。我不知道爲什麼這樣做 - 我沒有做任何特殊的事情來填充正常的ListView。

ListView控件使用該適配器:

class ActionListAdapter extends BaseAdapter 
    { 
     private final ArrayList<MapActionListViewItem> _items = new ArrayList<MapActionListViewItem>(); 
     @Override public final MapActionListViewItem getItem(int position) 
     { 
      return _items.get(position); 
     } 
     @Override public final long getItemId(int position) 
     { 
      return position; 
     } 
     @Override public final int getCount() 
     { 
      return _items.size(); 
     } 
     @Override public final View getView(int position, View convertView, ViewGroup parent) 
     { 
      return _items.get(position).Row; 
     } 
     public final void clear() 
     { 
      _items.clear(); 
      notifyDataSetChanged(); 
     } 
     public final void addItem(MapActionListViewItem item) 
     { 
      _items.add(item); 
      notifyDataSetChanged(); 
     } 
     public final void removeItem(MapActionListViewItem item) 
     { 
      _items.remove(item); 
      notifyDataSetChanged(); 
     } 
     public final void refresh() 
     { 
      final Iterator<MapActionListViewItem> i = _items.iterator(); 
      while (i.hasNext()) 
       if (!i.next().refresh()) 
        i.remove(); 
     } 
    } 

的MapActionListViewItem對象是更新子視圖的容器類:

public abstract class MapActionListViewItem 
{ 
    public final ImageView  Icon; 
    public final TextView  Title; 
    public final TextView  Subtitle; 
    public final TextView  Info; 
    public final View   Row; 
    public final int   MapAction; 
    protected final GlobalState State; 
    public MapActionListViewItem(GlobalState state, int mapActionType) 
    { 
     MapAction = mapActionType; 
     State = state; 
     Row = state.Inflater.inflate(R.layout.actionlistviewitem, null); 
     Icon = (ImageView) Row.findViewById(R.id.actionitem_image); 
     Title = (TextView) Row.findViewById(R.id.actionitem_title); 
     Subtitle = (TextView) Row.findViewById(R.id.actionitem_subtitle); 
     Info = (TextView) Row.findViewById(R.id.actionitem_info); 
    } 
    public abstract boolean refresh(); 
} 

我已經爲我的疑難解答問題殘疾人清爽,讓ISN沒有關係。包含在ListView中的每個子行從actionlistviewitem.xml充氣:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="wrap_content" android:orientation="vertical" 
    android:layout_width="wrap_content"> 
    <LinearLayout android:layout_height="wrap_content" 
     android:layout_width="fill_parent"> 
     <ImageView android:id="@+id/actionitem_image" 
      android:scaleType="center" android:layout_height="25dp" 
      android:layout_width="25dp" /> 
     <TextView android:id="@+id/actionitem_title" 
      android:textColor="@color/white" android:text="TITLE" 
      android:textSize="14dp" android:layout_height="wrap_content" 
      android:layout_gravity="center" android:layout_width="wrap_content" /> 
    </LinearLayout> 
    <TextView android:layout_height="wrap_content" android:id="@+id/actionitem_subtitle" 
     android:text="Sub Title" android:textSize="12dp" 
     android:layout_marginLeft="25dp" android:layout_width="wrap_content" /> 
    <TextView android:layout_height="wrap_content" 
     android:textSize="10dp" android:text="Information" 
     android:layout_marginLeft="25dp" android:layout_width="wrap_content" 
     android:id="@+id/actionitem_info" /> 
</LinearLayout> 

我一直在敲我的頭這沒有成功天。不管我嘗試從上面的XML中看到的Child視圖以非常醜陋和意想不到的方式隨機滾動,並且在我的DroidX上幾乎沒有任何滾動滯後。任何幫助將不勝感激。

(在Eclipse 3.5.2開發,針對SDK 8 - 2.2)

+0

半透明背景是一個昂貴的計算,而在ListView中意味着你正在禁用很多ListView的優化;你可能想重新考慮這一點。 – 2010-10-20 16:47:51

回答

0

充氣& findViewById上的ListView相當昂貴,你可能想查看this video presentation第一個知道如何ListView的作品,並提供有效的編碼。