2010-10-20 16 views
0

Je suis en train de construire un ListView qui fait FILL_PARENT pour la largeur, et WRAP_CONTENT pour la hauteur, puis le centrer dans sa vue parente.Android ListView Laggy et Child Views Shrinking

Le ListView est semi-transparent de sorte l'activité sous-jacente est visible, alors j'utiliser:

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

Autre que cela, il s'agit d'un ListView complètement standard.

Deux questions:

A) Le ListView est extrêmement laggy lors du défilement (même avec seulement quelques enfants). Pourquoi, et comment puis-je l'optimiser? B) Chaque fois que la liste est défilée, certaines des vues enfant contenues dans le ListView rétrécissent et se dilatent aléatoirement et cela a l'air horrible. Parfois, ils sont coincés étant petit. Je n'ai aucune idée de pourquoi c'est ce qu'il fait - je ne fais rien de spécial en dehors du remplissage d'un ListView normal.

ListView utilise cet adaptateur:

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(); 
     } 
    } 

L'objet MapActionListViewItem est une classe de conteneur qui met à jour les vues de l'enfant:

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(); 
} 

J'ai rafraîchissante désactivé pour le dépannage de mes problèmes, de sorte que ISN n'est pas pertinent. Chaque ligne de l'enfant contenue dans le ListView est gonflé de 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> 

J'ai frappais ma tête contre ce pendant plusieurs jours sans succès. Peu importe ce que j'essaie, les vues enfant du XML ci-dessus se rétrécissent aléatoirement tout en défilant d'une manière très laide et inattendue, et est presque inutile avec le retard de défilement sur mon DroidX. Toute aide serait grandement appréciée.

(développement dans Eclipse 3.5.2, ciblant SDK 8 à 2,2)

+0

L'arrière-plan semi-transparent est un calcul coûteux, et dans ListView, vous désactivez de nombreuses optimisations de ListView; vous pourriez vouloir reconsidérer à ce sujet. –

Répondre

0

Gonfler & findViewById est assez cher sur ListView, vous pouvez voir this video presentation d'abord savoir comment fonctionne ListView et de fournir un codage efficace.