2017-03-08 9 views
0

とaddView私は次のエラーを取得しています:問題:ArrayListの

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

私はビューから親を削除するが、それは動作していません。

コード:

LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
LinearLayout root = (LinearLayout) linha.findViewById(R.id.ingredientes_sel); 
List views = new ArrayList(); 

View view = inflater.inflate(R.layout.item_obs_carrinho, null); 
view.setLayoutParams(
     new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT)); 

if (tipo == 2 || tipo == 3) { //add 
    for (int i = 0; i < objetos_add.get(0).length; i++) { 
     if (!objetos_add.get(0)[i].equals("")) { 
      if (view.getParent() != null) 
       ((ViewGroup) view.getParent()).removeView(view); 
      TextView n = (TextView) view.findViewById(R.id.item_ingred_carrinho); 
      n.setText(objetos_add.get(0)[i]); 

      TextView qtd = (TextView) view.findViewById(R.id.quantidade); 
      qtd.setText(objetos_add.get(1)[i]); 

      views.add(view); 
     } 
    } 
} 
if (tipo == 1 || tipo == 3) { //rem 
    for (int i = 0; i < objetos_rem.get(0).length; i++) { 
     if (!objetos_rem.get(0)[i].equals("")) { 
      if (view.getParent() != null) 
       ((ViewGroup) view.getParent()).removeView(view); 
      TextView n = (TextView) view.findViewById(R.id.item_ingred_carrinho); 
      n.setText(objetos_rem.get(0)[i]); 

      TextView qtd = (TextView) view.findViewById(R.id.quantidade); 
      qtd.setText(""); 

      ImageView add = (ImageView) view.findViewById(R.id.add_ou_rem); 
      add.setImageResource(android.R.drawable.ic_delete); 

      views.add(view); 
     } 
    } 
} 

for (int i = 0; i < views.size(); i++) 
    root.addView((View) views.get(i)); /* <---- ERRO */ 

何が悪いのでしょうか?この質問に基づいて

EDIT

Dynamic layout inflator within a loop

+0

ここで何をしようとしているのか説明できますか? –

+0

製品のリストを作成し、XMLレイアウトのモデルを使用します。このレイアウトの内容は、2つのテキストと1つのイメージを含むLinearLayoutです。 –

+0

リストが必要な場合は、なぜArrayAdapterを使用していませんか? –

答えて

0

あなたは一度

View view = inflater.inflate(R.layout.item_obs_carrinho, null); 

これをしなかった。そして、あなたはそのため、あなたが以前に追加したviewがまったく同じで、root.addView(view)複数回呼び出さしたがって、親を持つことになります。


複数のビューを展開してルートに追加する必要があります。

だから、あなたはこの方法

private View getCustomView(LayoutInflater inflater, int tipo, List<String[]> data, int pos) { 
    // Inflate 
    View view = inflater.inflate(R.layout.item_obs_carrinho, null); 
    view.setLayoutParams(
      new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT)); 

    // Remove parent 
    if (view.getParent() != null) 
     ((ViewGroup) view.getParent()).removeView(view); 

    // Find Views 
    TextView n = (TextView) view.findViewById(R.id.item_ingred_carrinho); 
    TextView qtd = (TextView) view.findViewById(R.id.quantidade); 

    // Set views based on type 
    if (tipo == 2 || tipo == 3) { // add 
     n.setText(data.get(0)[pos]); 
     qtd.setText(data.get(1)[pos]); 
    } else if (tipo == 1 || tipo == 3) { // rem 
     n.setText(data.get(0)[pos]); 
     qtd.setText(""); 
     ImageView add = (ImageView) view.findViewById(R.id.add_ou_rem); 
     add.setImageResource(android.R.drawable.ic_delete); 
    } 
    return view; 
} 

を抽出し、それら二つのループの間にそれを呼び出すことができます。

final LayoutInflater inflater = LayoutInflater.from(MainActivity.this); 

// tipo = 2 or 3 
for (int i = 0; i < objetos_add.get(0).length; i++) { 
    if (!objetos_add.get(0)[i].isEmpty()) { 
     root.addView(getCustomView(inflater, tipo, objetos_add, i)); 
    } 
} 

// tipo = 1 or 3 
for (for int i = 0; i < objetos_rem.get(0).length; i++) { 
    if (!objetos_rem.get(0)[i].isEmpty()) { 
     root.addView(getCustomView(inflater, tipo, objectos_rem, i)); 
    } 
} 
+0

私は理解しています。しかし、私もobjetos_remとやりとりする必要があります...これも、addViewを何度も呼び出さないとどうしますか? –

+0

さて、2つのループが必要です。アップデート –

+0

を参照してください。すぐにテストします。 –

関連する問題