2017-05-31 70 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设置为空,然后创建实例。

希望这个工程。