2015-11-04 91 views
1

即時通訊與xamarin android應用程序的問題是,一旦我調用適配器中的任何項目上的單擊事件它將工作,但它調用的不僅僅是我單擊的一個,例如我的意思是點擊共享和共享意圖將顯示在列表視圖適配器中的多個項目上,但不止一次。這是適配器中的代碼。請讓我知道如何解決這個問題。我曾試圖代表,甚至要禁止上點擊其他列表視圖項的程度Adapterview點擊事件

代碼:

namespace NameSpace 
{ 
    public class dashboardAdapter : BaseAdapter<DashboardLINQ> 
    { 
     List<DashboardLINQ> items; 
     Activity context; 
     string mid; 
     public dashboardAdapter(Activity context, List<DashboardLINQ> items) 
      : base() 
     { 
      this.context = context; 
      this.items = items; 
     } 
     public override long GetItemId(int position) 
     { 
      return position; 
     } 
     public override DashboardLINQ this[int position] 
     { 
      get { return items[position]; } 
     } 
     public override int Count 
     { 
      get { return items.Count; } 
     } 
     public override View GetView(int position, View convertView, ViewGroup parent) 
     { 
      View view = convertView; 
      if (view == null) 
      { 
       view = LayoutInflater.From(context).Inflate (Resource.Layout.dashboardItemLayout, null, false); 
      } 

      ImageView prof = view.FindViewById<ImageView>(Resource.Id.imageView1); 
      Koush.UrlImageViewHelper.SetUrlDrawable (prof, "http://www.mymentor.org.za/"+items [position].uPicLocal); 

      mid = items [position].MID; 

      TextView usrname = view.FindViewById<TextView> (Resource.Id.textView1); 
      usrname.Text = items [position].uFullName; 

      TextView date = view.FindViewById<TextView> (Resource.Id.textView2); 
      date.Text = items [position].pDate; 

      ImageView imagen = view.FindViewById<ImageView>(Resource.Id.imageView2); 
      Koush.UrlImageViewHelper.SetUrlDrawable (imagen, "http://www.mymentor.org.za/"+items [position].pImage); 

      TextView desc = view.FindViewById<TextView> (Resource.Id.textView3); 
      desc.Text = Html.FromHtml (items [position].pDesc).ToString(); 

      TextView comlike = view.FindViewById<TextView> (Resource.Id.textView4); 
      comlike.Text = "Likes: "+items [position].likecnumrows+" Comments: "+items [position].commentscnumrows; 

      ImageButton like = view.FindViewById<ImageButton> (Resource.Id.button1); 
      ImageButton comment = view.FindViewById<ImageButton> (Resource.Id.button2); 
      ImageButton share = view.FindViewById<ImageButton> (Resource.Id.button3); 

      like.Click += delegate(object sender, EventArgs e) { 
       WebClient client = new WebClient(); 
       Uri uri = new Uri("url"); 
       NameValueCollection parameters = new NameValueCollection(); 
       parameters.Add("UID", items[position].MID); 
       parameters.Add("PID", items[position].ID); 
       client.UploadValuesAsync(uri, parameters); 
       like.SetImageResource(Resource.Drawable.ButtonComment); 
      }; 


      share.Focusable = false; 
      share.FocusableInTouchMode = false; 
      share.Clickable = true; 

      share.Click += delegate(object sender, EventArgs e) { 
       int MaxLength = 150; 

       var name = Html.FromHtml (items [position].pDesc).ToString(); 
       if (name.Length > MaxLength) { 
        name = name.Substring(0, MaxLength) + "... My Mentor"; 
       } 

       var myIntent = new Intent(Android.Content.Intent.ActionSend); 
       myIntent.PutExtra(Intent.ExtraText, name); 
       myIntent.SetType("text/plain"); 
       this.context.StartActivity(Intent.CreateChooser(myIntent,"Choose an App")); 
      }; 

      return view; 
    } 

} 
+1

發生這種情況,因爲Android會重新使用行。您可以嘗試使用ViewHolder pattern.ill顯示稍後如何執行此操作。 – XTL

+0

@VetaLio請。一整天都在苦苦掙扎。 –

+1

你試過了嗎? – XTL

回答

2

出現這種情況,是因爲Android的重用行和調用GetView方法很多次數(例如,當你滾動你的列表視圖,Android自動啓動GetView來繪製隱藏的項目,以及爲什麼你的「點擊」重複)。

所以你可以嘗試使用ViewHolder模式。 檢查了這一點(我的小例子):
MainLayout.axml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <ListView 
     android:minWidth="25px" 
     android:minHeight="25px" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/lst" /> 
</LinearLayout> 

的代碼和ListItem.axml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:minWidth="25px" 
    android:minHeight="25px"> 
    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="50dp" 
     android:id="@+id/relativeLayout1"> 
     <TextView 
      android:text="Text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/txt" 
      android:layout_centerInParent="true" /> 
     <Button 
      android:text="PUSH ME" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/Push" 
      android:layout_alignParentRight="true" /> 
    </RelativeLayout> 
</LinearLayout> 

的OnCreate()方法

protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 

      SetContentView(Resource.Layout.Main); 

         ListView lst = FindViewById<ListView>(Resource.Id.lst); 

      List<string> Data = new List<string>(); 
      Data.Add("Prosto GG"); 
      Data.Add("Prosto GG"); 
      Data.Add("Prosto GG"); 
      Data.Add("Prosto GG"); 
      Data.Add("Prosto GG"); 
      Data.Add("Prosto GG"); 
      Data.Add("Prosto GG"); 
      Data.Add("Prosto GG"); 
      Data.Add("Prosto GG"); 
      Data.Add("Prosto GG"); 
      Data.Add("Prosto GG"); 
      Data.Add("Prosto GG"); 
      Data.Add("Prosto GG"); 
      Data.Add("Prosto GG"); 
      Data.Add("Prosto GG"); 
      Data.Add("Prosto GG"); 
      CustomAdapter cst = new CustomAdapter(Data, this); 
      lst.Adapter = cst; 

     } 
    } 

和這個職位的主要部分,CustomAdapter類:

class CustomAdapter: BaseAdapter<string> 
    { 
     Dialog alertDialog; 
     int count = 0; 
     List<string> _Items; 
     Context _context; 
     public CustomAdapter(List<string> Items,Context context) 
     { 
      this._Items = Items; 
      this._context = context; 
     } 

     #region implemented abstract members of BaseAdapter 
     public override long GetItemId(int position) 
     { 
      return position; 
     } 
     public override View GetView(int position, View convertView, ViewGroup parent) 
     { 
      ServiceViewHolder holder = null; 

      var view = convertView; 

      if (view == null) 
      { 
       ////this is part of ViewHolder pattern,new istance of ViewHolder 
       holder = new ServiceViewHolder(); 
       view = LayoutInflater.From(_context).Inflate(Resource.Layout.ListItem, null); 
       holder.Txt = view.FindViewById<TextView>(Resource.Id.txt); 
       holder.PushME = view.FindViewById<Button>(Resource.Id.Push); 
       //put your handler here,in this block of code,like this 
       holder.PushME.Click += (sender, e) => 
        { 
         count++; 
         var builder = new AlertDialog.Builder(_context); 
         builder.SetTitle("test"); 

         builder.SetMessage(holder.Txt.Text + " " + count); 
         builder.SetCancelable(false); 

         builder.SetPositiveButton("OK", new EventHandler<DialogClickEventArgs>((sender1, e2) => 
          { 
           alertDialog.Dismiss(); 
          })); 
         alertDialog = builder.Create(); 
         alertDialog.SetCanceledOnTouchOutside(false); 
         alertDialog.Show(); 
        }; 
       view.Tag = holder; 
      } 
      else 
      { 
       holder = view.Tag as ServiceViewHolder; 
      } 
      holder.Txt.Text = _Items[position]; 

      return view; 
     } 
     public override int Count 
     { 
      get 
      { 
       return _Items.Count; 
      } 
     } 
     #endregion 
     #region implemented abstract members of BaseAdapter 
     public override string this[int index] 
     { 
      get 
      { 
       return _Items[index]; 
      } 
     } 
     #endregion 

    } 

    public class ServiceViewHolder : Java.Lang.Object 
    { 
     public Button PushME { get; set; } 

     public TextView Txt { get; set; } 

    } 

所以,如果你想使用這個模式,你必須做到:

  1. 製作類,並定義的屬性您控件(列表項)
  2. 只要把你的處理程序中的代碼,其中的觀點是空塊(參見下面的代碼)

你的情況是這樣的:

if(view == null) 
     { 
      //inflate layout and other stuff. 
      holder.like.Click += delegate(object sender, EventArgs e) { 
         WebClient client = new WebClient(); 
         Uri uri = new Uri("url"); 
         NameValueCollection parameters = new NameValueCollection(); 
         parameters.Add("UID", items[position].MID); 
         parameters.Add("PID", items[position].ID); 
         client.UploadValuesAsync(uri, parameters); 
         holder.like.SetImageResource(Resource.Drawable.ButtonComment); 
        }; 

      //etc 
     } 

欲瞭解更多詳細信息,請閱讀本article
享受。