我有一個具有特定數量圖片的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");
}
}
有誰知道這裏發生了什麼?
我同意這裏。 「適配器」只應該注意呈現數據,與數據的交互不應該在「適配器」中。這意味着你可以在別處使用'Adapter',而不必依靠硬編碼的點擊事件。正如Slack Shot所說,使用'ItemClick'事件,但是它看起來像你使用的是一個'ViewPager'而不是像你所描述的'GridView',這意味着你實際上正在做的是正確的事情,點擊'Adapter'內的'handler',因爲'ViewPager'不會暴露類似的東西。 'ViewPager'意味着一個完全不同的用例 – Cheesebaron