2017-03-08 53 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 */ 

有什麼不對?

編輯

基於這樣一個問題:Dynamic layout inflator within a loop

+0

你能解釋一下你在做什麼嗎? –

+0

創建產品列表,使用哪種模型的XML佈局。此佈局的內容是一個包含2個文本和一個圖像的LinearLayout(將此擴展) –

+0

如果您需要列表,爲什麼不使用ArrayAdapter? –

回答

0

你們這樣做,一旦

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

然後你叫root.addView(view)多次,所以之前添加任何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

好的,所以你需要兩個循環。查看更新 –

+0

好的,我會盡快測試。 –