2012-03-30 4 views
0

Je dois créer linéairement LinearLayouts selon une liste d'entités. Les mises en page sont dessinées sans problèmes. Mon problème est quand j'essaie de savoir sur quelle page j'ai cliqué, car c'est toujours le dernier.Création dynamique de la disposition linéaire cliquable

Le code est quelque chose comme ceci:

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

} 

Je vous remercie de l'aide. Merci

+0

D'où vient-il 'llNewProduct.Clickable = true;'? – waqaslam

Répondre

0

comme je l'ai dit le dernier commentaire. La question est résolue. Le code suivant affiche l'ID de la disposition cliquée.

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

Vous devez créer un tableau de suc booléen comme boolean[] flag = new boolean[productList.length]. Après cela, vous pouvez définir flag [i] = true lorsque vous définissez llNewProduct.Clickable = true; autre drapeau de l'ensemble [i] = faux; Après la fin de chaque boucle, vous pouvez savoir cliqués lineanlayout avec l'aide de ce drapeau, comme

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

Utilisez le code suivant dans la boucle foor

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

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

Je ne veux pas savoir quelle disposition est cliquable. Tous sont cliquables. J'ai besoin de savoir, par exemple, le nom du produit contenu dans la mise en page. Et quand je clique dans une mise en page, je reçois toujours le dernier nom de produit – daniherculano

+0

Vous pouvez utiliser llNewProduct.setTag (i) et lorsque vous cliquez sur la linearlayout, vous pouvez l'obtenir de getTag() et il vous donnera la valeur de i . Chaque fois que vous obtenez la position de i, vous pouvez obtenir la valeur du nom de produit à partir de productList.get (i) .getProductName(). Si vous avez toujours un problème s'il vous plaît faites le moi savoir. – Jitendra

+0

En faisant cela, j'ai le même problème. La balise renvoyée est la dernière pour chaque mise en page cliquée. Merci de votre aide. – daniherculano

0

vous utilisez même référence pour tous vue ajouté, créer des vues différentes en boucle côté Essayez comme ceci:

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