0

幅に FILL_PARENT 、高さに WRAP_CONTENT を実行する ListView をプログラムで作成し、それを親ビューの中央に配置しています。

ListView は半透明であるため、その背後にあるアクティビティが表示されるため、次を使用します。

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

それ以外は、完全に標準のすぐに使える ListView です。

2 つの問題:

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 の Child ビューを何を試しても、非常に見苦しく予期しない方法でスクロールしているときにランダムに縮小し、DroidX のスクロール ラグではほとんど役に立ちません。どんな助けでも大歓迎です。

(Eclipse 3.5.2 で開発、SDK 8 - 2.2 をターゲット)

4

1 に答える 1

-1

Inflate と findViewById は ListView では非常にコストがかかります。最初にこのビデオ プレゼンテーションを表示して、ListView の仕組みを理解し、効率的なコーディングを提供することをお勧めします。

于 2010-10-22T06:57:17.410 に答える