2016-08-25 9 views
0

상점 페이지를 만들려고합니다 클릭 가능. 클릭 한 항목에 대해 AlertDialog을 보여주는 사용자 지정 목록보기를 사용하고 있습니다.Android리스트보기 AlertDialog로 클릭 가능

나의 목표는 버튼을 클릭 할 때 구매를 허용하는 경고 대화 상자를 여는 것입니다. 나는 모든 목록을 아래로 스크롤하면

, 많은에 AlertDialog는 대신 단지 하나의,를 표시합니다!

내 사용자 정의 어댑터가 BaseAdapter에서 확장, 내의 getView() 메소드는 다음과 같습니다

public override View GetView(int position, View convertView, ViewGroup parent) 
{ 
    var row = convertView; 
    ViewHolder holder = null; 

    if(row == null) 
    { 
     var inflater = context.GetSystemService(Context.LayoutInflaterService) as LayoutInflater; 
     row = inflater.Inflate(Resource.Layout.SingleRowStorePage, parent, false); 

     holder = new ViewHolder(row); 
     row.Tag = holder; 

    } else 
    { 
     holder = (ViewHolder)row.Tag; 
    }   

    //SET DATA 
    holder.Qtd.Text = "Qtd:" + quantities[position]; 
    holder.Stock.Text = "Stock: " + shops[position].Stock.ToString(); 
    holder.Name.Text = shops[position].Name; 
    holder.Creditos.Text = shops[position].Price.ToString() + " créditos "; 

    //CLICK 
    holder.Image.Click += delegate 
    { 
     Android.Support.V4.App.FragmentTransaction trans = manager.BeginTransaction(); 
     DialogShop dialog = new DialogShop(shops[position]); 
     dialog.Show(trans, "image"); 
    }; 

    //confirm shop? 
    holder.Comprar.Click += delegate 
    { 
     AlertDialog.Builder alert = new AlertDialog.Builder(context); 
     alert.SetTitle("Confirmar compra? item " + shops[position].Name + " com valor: " + quantities[position]); 
     alert.SetMessage("Lorem ipsum dolor sit amet, consectetuer adipiscing elit."); 
     alert.SetPositiveButton("Ok", (senderAlert, args) => 
     { 
      //Toast.MakeText(context, "Ok!", ToastLength.Short).Show(); 
     }); 

     alert.SetNegativeButton("Cancelar", (senderAlert, args) => 
     { 
      //Toast.MakeText(context, "Cancelar!", ToastLength.Short).Show(); 
     }); 

     Dialog dialog = alert.Create(); 
     dialog.Show(); 
     dialog.Dismiss(); 
    }; 

    return row; 
} 

내 ViewHolder가 :

private class ViewHolder : Java.Lang.Object 
{ 
    public ImageView Image { get; set; } 
    public Button Qtd { get; set; } 
    public TextView Stock { get; set; } 
    public TextView Name { get; set; } 
    public TextView Creditos { get; set; } 
    public Button Comprar { get; set; } 

    public ViewHolder(View view) 
    { 
     Image = view.FindViewById<ImageView>(Resource.Id.singleRowStore); 
     Qtd = view.FindViewById<Button>(Resource.Id.buttonComprar); 
     Stock = view.FindViewById<TextView>(Resource.Id.stockStore); 
     Name = view.FindViewById<TextView>(Resource.Id.nomeStore); 
     Creditos = view.FindViewById<TextView>(Resource.Id.creditosStore); 
     Comprar = view.FindViewById<Button>(Resource.Id.comprarStore); 
    } 
} 

enter image description here

+0

스크롤 할 때 또는 btn을 클릭 할 때 경고 대화 상자를 표시 하시겠습니까? –

+0

버튼을 클릭하면 – andre

답변

1

문제는 당신이다 델리게이트를 사용하여 이벤트를 연결하고 셀을 재활용 할 수 있으므로 추가 클릭 셀이 재사용 될 때마다 이벤트.

holder.Image.Click += delegate 
{ 
    Android.Support.V4.App.FragmentTransaction trans = manager.BeginTransaction(); 
    DialogShop dialog = new DialogShop(shops[position]); 
    dialog.Show(trans, "image"); 
}; 

대신 모든 핸들러에 대해이 작업을 수행 : 당신이 다시 얻을 수 없기 때문에 가능하면 당신은 대표 또는 익명 람다를 피해야한다

holder.Image.Click -= ImageClicked; 
holder.Image.Click += ImageClicked; 

private void ImageClicked (object sender, EventArgs e) 
{ 
    Android.Support.V4.App.FragmentTransaction trans = manager.BeginTransaction(); 
    DialogShop dialog = new DialogShop(shops[position]); 
    dialog.Show(trans, "image"); 
} 

대신의 어댑터에서

원래 방법을 참조하고 그것을 풀다. (더 많은 코드로 lamdba에 대한 참조를 유지하지 않고).

private class ViewHolder : Java.Lang.Object 
     { 
      //public EventHandler<> 
      public ImageView Image { get; set; } 
      public Button Qtd { get; set; } 
      public TextView Stock { get; set; } 
      public TextView Name { get; set; } 
      public TextView Creditos { get; set; } 
      public Button Comprar { get; set; } 

      //New Event Handler 
      public EventHandler<ImageClickedEventArgs> ImageClicked; 

      public ViewHolder(View view) 
      { 
       Image = view.FindViewById<ImageView>(Resource.Id.singleRowStore); 
       Qtd = view.FindViewById<Button>(Resource.Id.buttonComprar); 
       Stock = view.FindViewById<TextView>(Resource.Id.stockStore); 
       Name = view.FindViewById<TextView>(Resource.Id.nomeStore); 
       Creditos = view.FindViewById<TextView>(Resource.Id.creditosStore); 
       Comprar = view.FindViewById<Button>(Resource.Id.comprarStore); 

       Image.Click += Image_Click; 
      } 

      void Image_Click(object sender, EventArgs e) 
      { 
       ImageClicked?.Invoke(sender, new ImageClickedEventArgs(this)); 
      } 

      public class ImageClickedEventArgs : EventArgs 
      { 
       public ViewHolder ViewHolder { get; private set; } 

       public ImageClickedEventArgs(ViewHolder viewHolder) : base() 
       { 
        ViewHolder = viewHolder; 
       } 
      } 
     } 
+0

답변 해 주셔서 감사합니다. 하지만 ImageClicked 메서드 내부의 위치에 어떻게 액세스 할 수 있습니까? – andre

+0

이것은 원래 게시물의 문제와 다른 문제입니다. 이를 처리 할 패턴이 여러 개 있습니다. 한 가지 방법은 필요한 인수로 사용자 지정 EventArgs를 만드는 것입니다. 그런 다음 ImageClick 대신 구독하십시오. 더 많은 도움이 필요하면 모든 세부 사항을 알려줄 수 있습니다. – wishmaster

+0

Ty. 그것에 대해 좋은 자료를 얻었습니까? – andre