1

多くの子ビュー (ボタンなど) を持つスクロール パネルを作成しています。各子ビューには、行と列のインデックスに基づいて固定の場所があります。大量にあるため、最初は作成できず、メモリが不足するため、子ビューが画面ビュー ポートと交差するとき (ユーザーがその領域にスクロールするとき) にのみ子ビューを追加したいと考えています。onLayout() メソッドを次のようにオーバーライドします。

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);
    for (int row = 0; row < ROW_NUM; row++) {
        ColumnAdapter columnAdapter = mRowAdapter.getItem(row);
        for (int col = 0; col < COLUMN_NUM; col++) {
            ItemView itemView = columnAdapter.getView(col, null, this);
            if (isOnScreen(row, col)) {
                itemView.layout(col * 100, row * 100, (col + 1) * 100, (row + 1) * 100);
                addViewInLayout(itemView, row + col, null, true);
            }
        }
    }
    scrollTo(getScrollX(), getScrollY());
}

(ColumnAdapter は Adapter 拡張機能であり、ItemView はボタン拡張機能です)。スクロール中に onLayout() が呼び出されないため、これは機能しません。ユーザーがスクロールするときに ItemViews を動的に追加するにはどうすればよいですか?

4

2 に答える 2

0

ListView の使用を検討することもできます。それはあなたが望むことを正確に行います。それはその要素の遅延読み込みです。詳細については、 ListViewの Google IO セッションを参照してください。

つまり、拡張している Adapter クラスにはView getView(int position, View convertView, ViewGroup parent)機能があります。この関数をオーバーライドして、convertView が null でないかどうかを確認し、それをロードすることができます。これは、実際にはその子要素の以前に作成された View であるためです。

コストがかかるため、findViewById() 関数呼び出しを回避するための追加の詳細もあります。

于 2010-10-05T21:06:09.677 に答える
0

requestLayout() を使用できると思ったことは気にしないでください...

于 2010-10-05T20:48:10.607 に答える