2

사용자 지정 어댑터를 사용하여 목록에서 채우는 gridView에 이상한 문제가 발생했습니다.Monodorid의 GridView 어댑터

gridView의 첫 번째 페이지가 가득차면 다음 항목 중 일부가 누락되거나 동기화되지 않을 때까지 모든 것이 정상적으로 보입니다.

저는 두 개의 화면 캡처를 수행했습니다. 첫 번째는 단일 열, 두 번째는 두 개입니다. 당신이 볼 수 있듯이를 넣고 그림과 같이 첫 번째 페이지가 모두 올바르게 렌더링 :

단일 열 : http://screencast.com/t/mSoEsDf1cY

두 칼럼 : http://screencast.com/t/i6zfPLYf

나는 문제를 설명하는 코드를 단순화 :

public class Activity1 : Activity 
{ 
    List<Item> _items = null; 

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

     // Set our view from the "main" layout resource 
     SetContentView (Resource.Layout.Main); 

     _items = new List<Item>(); 

     for (int i =0; i < 30; i++) 
     { 
      Item newItem = new Item(); 
      newItem.Text = "Item " + i; 
      newItem.Bitmap = Android.Graphics.BitmapFactory.DecodeResource(this.Resources, Resource.Drawable.Icon); 

      _items.Add(newItem); 
     } 

     GridView grid = FindViewById<GridView> (Resource.Id.gridView1); 
     grid.SetNumColumns(2); 

     ItemGridViewAdapter adapter = new ItemGridViewAdapter(this, _items); 
     grid.Adapter = adapter; 
    } 

} 

public class Item 
{ 
    public Android.Graphics.Bitmap Bitmap { get; set; } 
    public string Text { get; set; } 
} 

public class ItemGridViewAdapter : BaseAdapter<Item> 
{ 
    private List<Item> _items = null; 
    private Context _context = null; 

    public override int Count { 
     get { 
      return _items.Count; 
     } 
    } 

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

    public override Item this[int position] { 
     get { 
      return _items[position]; 
     } 
    } 

    public ItemGridViewAdapter (Context context, List<Item> items) 
    { 
     _items = items; 
     _context = context; 
    } 

    public override View GetView (int position, View convertView, ViewGroup parent) 
    { 
     //based on http://developer.android.com/guide/topics/ui/layout/gridview.html 

     RelativeLayout layout = null; 

     if (convertView == null) { 
      layout = new RelativeLayout(_context); 

      RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams (RelativeLayout.LayoutParams.WrapContent, RelativeLayout.LayoutParams.WrapContent); 

      ImageView image = new ImageView (_context); 
      image.LayoutParameters = new Gallery.LayoutParams (150, 150); 
      image.SetImageBitmap (this[position].Bitmap); 
      image.Id = 1; 
      layout.AddView (image); 

      RelativeLayout.LayoutParams title_lp = new RelativeLayout.LayoutParams (RelativeLayout.LayoutParams.WrapContent, RelativeLayout.LayoutParams.WrapContent); 
      TextView title = new TextView (_context); 
      title.Text = this[position].Text; 
      title.Id = 2; 
      title.SetTextColor (Android.Graphics.Color.White); 
      title_lp.AddRule (LayoutRules.RightOf, 1); 
      title_lp.AddRule (LayoutRules.CenterVertical); 
      layout.AddView (title, title_lp); 

     } else { 

      layout = (RelativeLayout)convertView; 
     } 

     return layout; 
    } 

} 

어떤 아이디어라도 감사하겠습니다.

답변

1

코드는 여기에 어떤 수정없이 어떤 임의의 기존 항목 뷰를 재사용 :

layout = (RelativeLayout)convertView; 

귀하의 getView()에 상관없이 재생, 모든보기를 들어, 위치의 함수이다 새로운 가치를 제공하기 위해 수정해서는 안 나 방금 만들었습니다.

여기의 예제를 고려하십시오 : http://developer.android.com/guide/topics/ui/layout/gridview.html.

"else"부분과 거의 같습니다. 하지만 그 후에는보기에 새로운 가치를 부여합니다. 즉, 새로운 이미지 :

} else { 
    imageView = (ImageView) convertView; 
} 

// Analogous update is missing from your code. 
// Set your view's image, text, etc. here: 
imageView.setImageResource(mThumbIds[position]); 

return imageView; 
+0

절대적으로 환상적입니다. 나무에서 나무를 볼 수있을 것 같지 않고 겉으로보기에 가장 중요한 한 줄의 코드를 간과 한 것 같습니다. 나는 다시 생각해 냈고 이제는 완벽하게 작동합니다. 많은 감사합니다! –