Android ListView Laggy和Child Views缩小

时间:2010-10-20 15:58:12

标签: android listview scroll lag

我正在以编程方式构建一个ListView,它为宽度执行FILL_PARENT,为高度执行WRAP_CONTENT,然后将其居中在其父视图中。

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

我已禁用刷新以解决问题,因此无关紧要。 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中的子视图在以非常丑陋和意想不到的方式滚动时随机缩小,并且对于我的DroidX上的滚动延迟几乎无用。任何帮助将不胜感激。

(在Eclipse 3.5.2中开发,针对SDK 8 - 2.2)

1 个答案:

答案 0 :(得分:-1)

膨胀&amp; findViewById在ListView上非常昂贵,您可能希望首先查看this video presentation以了解ListView的工作原理并提供有效的编码。