Xamarin Android Custom Listview Error



在我的自定义列表视图中,我不断得到System.NullReferenceException:对象引用未设置为对象的实例。

这里完全不知道为什么会发生这种情况。

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;
}
}

}

您应该从验证视图是否为 null 的ifViewHolderItem进行初始化,并稍微简化一下代码。

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设置为 null,然后创建实例。

希望这有效。