2013-11-28 58 views
0

我有一個具有特定數量圖片的GridView。點擊圖片時,會啓動一個全屏顯示的新活動。現在發生的奇怪事情是:單擊某個項目時出現奇怪的BaseAdapter行爲

當您單擊第一張圖片(索引0)時,它不會像它應該那樣啓動該活動。對於我的其餘照片來說,它做得很好。但是,當我點擊第一個項目,然後點擊另一個項目時,第一個項目彈出(索引0),其下方有正確的挖掘項目。這也是非常煩人的,當我點擊關閉按鈕,當這種奇怪的行爲出現時,第一項(索引0)重新啓動自己無數次。 現在我的適配器代碼如下:

class GridAdapter : BaseAdapter 
{ 
    private Context c; 
    private List<string[]> griditems; 
    private int ColumnWidth; 
    private LayoutInflater inflater; 
    private App app; 

    public GridAdapter(Context c, List<string[]> griditems, int ColumnWidth) { 
     this.c = c; 
     this.griditems = griditems; 
     this.ColumnWidth = ColumnWidth; 
     inflater = LayoutInflater.From (c); 
     app = (App)Application.Context; 
    } 

    #region implemented abstract members of BaseAdapter 

    public override Java.Lang.Object GetItem (int position) 
    { 
     throw new NotImplementedException(); 
    } 

    public override long GetItemId (int position) 
    { 
     return position; 
    } 

    public override View GetView (int position, View convertView, ViewGroup parent) 
    { 

     ImageView ImageView; 

     if (convertView == null) { 

      convertView = inflater.Inflate (Resource.Layout.PhotoGridItem, parent, false); 
      ImageView = (ImageView)convertView.FindViewById<ImageView> (Resource.Id.Photo); 

     } else { 

      ImageView = (ImageView)convertView.FindViewById<ImageView> (Resource.Id.Photo); 

     } 

     ImageView.SetScaleType (ImageView.ScaleType.CenterCrop); 

     convertView.LayoutParameters = new GridView.LayoutParams (ColumnWidth, ColumnWidth); 
     ImageView.LayoutParameters = new RelativeLayout.LayoutParams (ColumnWidth , ColumnWidth); 

     convertView.Click += (object sender, EventArgs e) => { 

      var intent = new Intent (Application.Context, typeof(PhotoActivity)); 
      intent.SetFlags(ActivityFlags.NewTask); 
      intent.PutExtra("position", position); 
      Application.Context.StartActivity (intent); 

     }; 

     UrlImageViewHelper.UrlImageViewHelper.SetUrlDrawable (ImageView, griditems.ElementAt(position)[1], Resource.Drawable.no_location); 



     return convertView; 

    } 

    public override int Count { 
     get { 
      return this.griditems.Count; 
     } 
    } 

    #endregion 

    public void Append(List<string[]> items) { 
     this.griditems.Concat (items); 
    } 

    public void Prepend(List<string[]> items) { 
     items.Reverse(); 
     items.Concat (this.griditems); 
    } 

    public void Replace(List<string[]> items) { 
     this.griditems.Clear(); 
     items.Reverse(); 
     this.griditems = items; 
    } 

而且它開始是如下活動:

public class PhotoActivity : Activity 
{ 
    private ViewPager ViewPager; 
    private PhotoAdapter Adapter; 
    private App app; 

    protected override void OnCreate (Bundle bundle) 
    { 
     base.OnCreate (bundle); 
     app = (App)Application.Context; 
     SetContentView (Resource.Layout.PhotoActivity); 

     ViewPager = (ViewPager)FindViewById<ViewPager> (Resource.Id.pager); 

     Intent i = Intent; 
     int position = i.GetIntExtra ("position", 0); 

     Adapter = new PhotoAdapter (this, app.PhotoList); 

     ViewPager.Adapter = Adapter; 

     ViewPager.CurrentItem = position; 
    } 

    protected override void OnDestroy() 
    { 
     ViewPager.Dispose(); 
     Adapter.Dispose(); 
     base.OnDestroy(); 
     Console.WriteLine ("OnDestroy() called"); 
    } 
} 

有誰知道這裏發生了什麼?

回答

0

我會強烈建議將Click事件帶出適配器。當使用GridViews或ListView時,您希望在GridView上使用ItemClick事件或覆蓋自定義ListActivity的OnListItemClick方法。

使用ListActivity時,可以使用底部的代碼,就像你需要的一樣。

我的合作伙伴有關於如何將上下文菜單集成到ListActivity中的博客文章。你可能想看看那篇文章。通常情況下,用例首先會涉及點擊某個項目的單個操作,但可能最終會希望爲任何點擊提供一個選項菜單。以下是一個鏈接。

如果您想在開始新活動後關閉ListActivity或其中包含GridView的Activity,只需將this.Finish()添加到下面任一代碼示例的底部即可。

Context Menu Blog Post

哦,嗯...歡迎Xamarin。

gridview.ItemClick += delegate (object sender, ItemEventArgs args) { 
     var intent = new Intent (Application.Context, typeof(PhotoActivity)); 
     intent.SetFlags(ActivityFlags.NewTask); 
     intent.PutExtra("position", args.Position); 
     this.StartActivity (intent); 
}; 

protected override void OnListItemClick(ListView l, View v, int position, long id) 
{ 
     var intent = new Intent (Application.Context,typeof(PhotoActivity)); 
      intent.SetFlags(ActivityFlags.NewTask); 
      intent.PutExtra("position", position); 
      this.StartActivity (intent); 
} 
+0

我同意這裏。 「適配器」只應該注意呈現數據,與數據的交互不應該在「適配器」中。這意味着你可以在別處使用'Adapter',而不必依靠硬編碼的點擊事件。正如Slack Shot所說,使用'ItemClick'事件,但是它看起來像你使用的是一個'ViewPager'而不是像你所描述的'GridView',這意味着你實際上正在做的是正確的事情,點擊'Adapter'內的'handler',因爲'ViewPager'不會暴露類似的東西。 'ViewPager'意味着一個完全不同的用例 – Cheesebaron

相關問題