2012-03-30 17 views
0

Ich muss LinearLayouts dynamisch nach einer Entity List erstellen. Die Layouts werden ohne Probleme gezeichnet. Mein Problem ist, wenn ich versuche zu erkennen, auf welches Layout ich geklickt habe, da immer auf das letzte verwiesen wird.Anklickbares lineares Layout dynamisch erstellen

Der Code ist so etwas wie dieses:

LinearLayout llProducts = FindViewById<LinearLayout>(Resource.Id.llProducts); 
LinearLayout llNewProduct; 
int i = 0; 

foreach(Product p in productsList) 
{ 

    llNewProduct = new LinearLayout(this); 
    llNewProduct.Clickable = true; 
    llNewProduct.Id = i++; 

    TextView txtProduct = new TextView(this); 
    txtProduct.Text = p.Name; 

    llNewProduct.AddView(txtProduct); 
    llProducts.AddView(llNewProduct); 

    llNewProduct.Click += (sender, e) 
    { 
     //This always shows the last Id 
     Toast.MakeText(this, llNewProduct.Id.ToString(), ToastLength.Short).Show(); 
    } 

} 

ich etwas Hilfe zu schätzen wissen. Danke

+0

Woher kommt es? 'LlNewProduct.Clickable = true;'? – waqaslam

Antwort

0

Als ich auf dem letzten Kommentar sagte. Die Frage ist gelöst. Nächster Code zeigt die ID aus dem angeklickten Layout.

llNewProduct.Click += (sender, e) 
{ 
    LinearLayout ll = sender as LinearLayout; 
    Toast.MakeText(this, ll.Id.ToString(), ToastLength.Short).Show(); 
} 
0

Sie müssen Array of boolean sucg als boolean[] flag = new boolean[productList.length] erstellen. Danach können Sie flag [i] = true setzen, wenn Sie llNewProduct.Clickable = true setzen; anderes gesetztes Flag [i] = falsch; Nach Abschluss für jede Schleife Sie herausfinden können, mit Hilfe dieser Flagge geklickt lineanlayout wie

for(int i=0;i<flag.length;i++){ 
if(flag[i]){ 
Log.v("TAG","Clicked linear layout"); 
}else{ 
Log.v("TAG","Not Clicked linear layout"); 
} 
} 

Verwendung in foor Schleife folgenden Code

llNewProduct.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Toast.makeText(YouActivity.this, ""+v.getId(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 
+0

Ich möchte nicht wissen, welches Layout anklickbar ist. Alle sind anklickbar. Ich muss zum Beispiel den Produktnamen wissen, der im Layout enthalten ist. Und wenn ich in irgendein Layout klicke, bekomme ich immer den letzten Produktnamen – daniherculano

+0

Sie können llNewProduct.setTag (i) verwenden und wenn Sie auf das lineare Layout klicken, können Sie es von getTag() erhalten und es wird Ihnen den Wert von i geben . Wenn Sie die Position von i erhalten, können Sie den Produktnamen von productList.get (i) .getProductName() erhalten. Wenn Sie noch ein Problem haben, lassen Sie es mich bitte wissen. – Jitendra

+0

Damit habe ich das gleiche Problem. Das zurückgegebene Tag ist das letzte für jedes angeklickte Layout. Danke für Ihre Hilfe. – daniherculano

0

Sie für alles hinzugefügt Ansicht desselben Bezug verwenden, schaffen unterschiedliche Ansichten in Seitenschleife Versuchen wie folgt aus:

for(int i1 = 0; i1 < 3;i1++) 
    { 

     LinearLayout llNewProduct = new LinearLayout(this); 
     LayoutParams p = new LayoutParams(100, 100); 
     llNewProduct.setLayoutParams(p); 
     if(i1 == 0) llNewProduct.setBackgroundColor(Color.RED); 
     if(i1 == 1) llNewProduct.setBackgroundColor(Color.GREEN); 
     if(i1 == 2) llNewProduct.setBackgroundColor(Color.BLUE); 
     llNewProduct.setClickable(true); 
     llNewProduct.setId(i1); 


     llNewProduct.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Toast.makeText(CaptureImage.this, ""+v.getId(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     ll1.addView(llNewProduct); 
    } 
Verwandte Themen