web-dev-qa-db-ja.com

同じビューを1度だけ拡張して親に複数回追加する方法

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

私が使用している現在のコードは以下のとおりです。forループの前に1回だけインフレートすると、「指定した子にはすでに親が指定されています。子の親でremoveView()を最初に呼び出す必要があります」というランタイムエラーが発生します。

        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);
        }
34
mkso

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

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

28
Jarek Potiuk

できません、古いviewオブジェクトからnew viewを作成しようとした場合でも、オブジェクトは値ではなく参照で渡されるため、 ExceptionchildAlreadyHasParentとして、したがって、唯一の方法は、viewfor loopに入れて、必要な回数にすることですこのループには、膨張ラインだけでなく、最初から作成プロセスが含まれている必要があります。

5
Muhammed Refaat

私はあなたのビューが何であるかわかりませんが、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 ListView[〜#〜] api [〜#〜] であなたのために行われた何かを明らかに試みています

5
Blundell

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

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

これはうまくいく、少なくとも私は働いた

4
Sidharth