35

親として垂直方向の LinearLayout があります。この親にプログラムで複数回ビューを追加したいと考えています。現在、親に追加する前に、すべての UI 要素への新しい参照を取得するたびに子を膨らませています。これはあまり効率的ではないようです。これを行うより良い方法はありますか。

私が使用している現在のコードは以下のとおりです。 for ループの前に一度だけインフレートすると、実行時エラーが発生します。

        LayoutInflater inflator = LayoutInflater.from(getBaseContext());
        LinearLayout parentPanel = findViewById(R.id.parent_pannel);

        ArrayList<String> myList = getData();
        for(String data : myList) {
            // inflate child
            View item = inflator.inflate(R.layout.list_item, null);
            // initialize review UI
            TextView dataText = (TextView) item.findViewById(R.id.data);
            // set data
            dataText.setText(data);
            // add child
            parentPanel.addView(item);
        }
4

4 に答える 4

28

インフレが遅いかどうかを実際に確認しましたか?私の知る限り、ビューの膨張は非常に高速です (手動でビューを作成するのとほぼ同じ速さです)。

驚くかもしれませんが、実際には inflate は XML をまったく解析しません。レイアウト用の XML はコンパイル時に解析および前処理されます。これらはバイナリ形式で格納されるため、ビューのインフレーションが非常に効率的になります (そのため、実行時に生成された XML からビューをインフレーションすることはできません)。

于 2011-06-28T23:01:30.557 に答える
5

new view古いviewオブジェクトからを作成しようとしても、オブジェクトは値ではなく参照によって渡されるため、 childAlreadyHasParentとして例外を取得することはできません。膨らませる回数。このループには、膨らませる行だけでなく、最初から作成プロセスを含める必要があります。viewfor loop

于 2014-06-04T08:46:48.563 に答える
5

あなたのビューが何であるかはわかりませんが、XML を膨らませて手動で作成しています。

   ArrayList<String> myList = getData();
    for(String data : myList) {

        LinearLayout layout = new LinearLayout(this);
        layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,             LayoutParams.WRAP_CONTENT));
        TextView textView = new TextView(this);
        textView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

        textView.setText(data);

        layout.addChild(textView);         

        parentPanel.addView(layout);
    }

しかし、そうです、 Simple ListViewAPIを使用してあなたのために行われたことを明らかに試みています

于 2011-06-28T22:55:35.663 に答える
4

複数回の膨張は、1回のショットで行うのと同じ方法ではできません。これがうまくいくことを願っています

LayoutInflater inflator = (LayoutInflater).getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    LinearLayout parentPanel = findViewById(R.id.parent_pannel);

    ArrayList<String> myList = getData();
    for(String data : myList) {
        // inflate child
        View item = inflator.inflate(R.layout.list_item, null);
        // initialize review UI
        TextView dataText = (TextView) item.findViewById(R.id.data);
        // set data
        dataText.setText(data);
        // add child
        parentPanel.addView(item);
    }

これはうまくいきます、少なくとも私はうまくいきました

于 2012-12-07T16:24:37.653 に答える