2017-05-31 40 views
1

在我的自定義列表視圖中,我不斷收到System.NullReferenceException:對象引用未設置爲對象的實例。在該viewholder.item =項目Xamarin Android自定義列表視圖錯誤

完全在這裏爲此感到遺憾,爲什麼發生這種情況。

public class CustomProductViewAdapter : BaseAdapter<ProductTableItem> 
{ 
    void MoreInfo_Click(object sender, System.EventArgs e) 
    { 
     var item = ((sender as View).Tag as ViewHolderItem).Item; 
     Log.Debug("TAG", item.ProdName); 
     var itemString = string.Format($"{item.ProdkeyID_str} : {item.ProdName} : {item.ProdPrice}"); 
     new AlertDialog.Builder(context).SetMessage(itemString).Create().Show(); 
    } 

    public class ViewHolderItem : Java.Lang.Object 
    { 
     public ProductTableItem Item; 
    } 

    readonly List<ProductTableItem> items; 
    readonly Activity context; 

    public CustomProductViewAdapter(Activity context, List<ProductTableItem> items) 
    { 
     this.context = context; 
     this.items = items; 
    } 

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

    public override ProductTableItem 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) 
    { 
     var view = convertView; 
     var item = items[position]; 
     ViewHolderItem viewHolder = null; 
     if (view == null) 
     { 
      viewHolder = new ViewHolderItem 
      { 
       Item = item 
      }; 
      view = context.LayoutInflater.Inflate(Resource.Layout.invoicing_sales_product_listview, null); 
      var moreInfo = view.FindViewById<ImageView>(Resource.Id.more_info); 
      moreInfo.Tag = viewHolder; 
      moreInfo.Click += MoreInfo_Click; 
     } 
     var moreInfo2 = view.FindViewById<ImageView>(Resource.Id.more_info); 
     viewHolder = moreInfo2.Tag as ViewHolderItem; 
     viewHolder.Item = item; 
     view.FindViewById<TextView>(Resource.Id.product_name).Text = item.ProdName; 
     view.FindViewById<TextView>(Resource.Id.product_mrpvalue).Text = item.ProdPrice; 
     view.FindViewById<TextView>(Resource.Id.product_bbvalue).Text = item.ProdPrice2; 
     view.FindViewById<TextView>(Resource.Id.product_savingsvalue).Text = "extra info"; 
     view.FindViewById<TextView>(Resource.Id.product_value).Text = "More info"; 

     return view; 
    } 
} 

}

+0

我用你的CustomProductViewAdapter加載listView,它適用於我,我沒有找到System.NullReferenceException。所以你能分享一個簡單的listView Demo嗎? –

回答

1

你應該把旅遊ViewHolderItem intitialization指出,如果驗證的視圖是空的if和簡化一點你的代碼。

public override View GetView(int position, View convertView, ViewGroup parent) 
{ 
    var view = convertView ?? context.LayoutInflater.Inflate(Resource.Layout.invoicing_sales_product_listview, null); 

    var item = items[position]; 
    ViewHolderItem viewHolder = new ViewHolderItem 
    { 
     Item = item 
    }; 

    var moreInfo = view.FindViewById<ImageView>(Resource.Id.more_info); 
    moreInfo.Tag = viewHolder; 
    moreInfo.Click += MoreInfo_Click; 

    var moreInfo2 = view.FindViewById<ImageView>(Resource.Id.more_info); 
    viewHolder = moreInfo2.Tag as ViewHolderItem; 
    viewHolder.Item = item; 
    view.FindViewById<TextView>(Resource.Id.product_name).Text = item.ProdName; 
    view.FindViewById<TextView>(Resource.Id.product_mrpvalue).Text = item.ProdPrice; 
    view.FindViewById<TextView>(Resource.Id.product_bbvalue).Text = item.ProdPrice2; 
    view.FindViewById<TextView>(Resource.Id.product_savingsvalue).Text = "extra info"; 
    view.FindViewById<TextView>(Resource.Id.product_value).Text = "More info"; 

    return view; 
} 

if(view == null)因爲你是確保你總是有方法的第一線圖實例不是不再需要。

您不需要將viewHolder設置爲空,然後創建實例。

希望這個工程。