親として垂直方向の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);
}
膨張が遅いかどうか実際に確認しましたか?私の知る限り、ビューのインフレーションは非常に高速です(ビューを手動で作成するのとほぼ同じくらい高速です)。
聞いて驚いたかもしれませんが、実際にはインフレートしてもXMLはまったく解析されません。レイアウト用のXMLは、コンパイル時に解析および前処理されます。これらはバイナリ形式で保存されるため、ビューのインフレーションが非常に効率的になります(そのため、実行時に生成されたXMLからビューをインフレートできません)。
できません、古いview
オブジェクトからnew view
を作成しようとした場合でも、オブジェクトは値ではなく参照で渡されるため、 ExceptionchildAlreadyHasParentとして、したがって、唯一の方法は、view
をfor loop
に入れて、必要な回数にすることですこのループには、膨張ラインだけでなく、最初から作成プロセスが含まれている必要があります。
私はあなたのビューが何であるかわかりませんが、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 [〜#〜] であなたのために行われた何かを明らかに試みています
複数回の膨張は、単一ショットで行うのと同じ方法で行うことはできません。これがうまくいくことを願っています
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);
}
これはうまくいく、少なくとも私は働いた