2010-10-20 3 views
0

Я программно создаю ListView, который делает FILL_PARENT для ширины, и WRAP_CONTENT для высоты, а затем центрирует его в своем родительском представлении.Android ListView Laggy and Child Views Shrinking

элемент управления ListView является полупрозрачным, так что активность за ним видна, так что я использую:

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

Кроме этого, это полностью стандартная версия ListView.

два вопроса:

A) ListView чрезвычайно лага при прокрутке (даже только несколько детей). Почему и как я могу его оптимизировать?

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> 

Я стучал голову против этого в течение нескольких дней без успеха. Независимо от того, что я пробовал, представления Child из приведенного выше XML сжимаются случайным образом, прокручиваясь очень безобразным и неожиданным способом и почти бесполезны с задержкой прокрутки на моем DroidX. Любая помощь будет принята с благодарностью.

(разработка в Eclipse, 3.5.2, нацеливание SDK 8 - 2.2)

+0

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

ответ

0

Накачайте & findViewById довольно дорого на ListView, вы можете захотеть просмотреть this video presentation первый, чтобы узнать, как ListView работы и обеспечить эффективное кодирование.