Xamarin Android自定义列表视图错误
在自定义listview中,我不断获取System.NullReferenceException:对象引用未设置为对象的实例。在该viewholder上。item=item 我完全不知道为什么会这样Xamarin Android自定义列表视图错误,android,xamarin,xamarin.android,Android,Xamarin,Xamarin.android,在自定义listview中,我不断获取System.NullReferenceException:对象引用未设置为对象的实例。在该viewholder上。item=item 我完全不知道为什么会这样 public class CustomProductViewAdapter : BaseAdapter<ProductTableItem> { void MoreInfo_Click(object sender, System.EventArgs e) {
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;
}
}
公共类CustomProductViewAdapter:BaseAdapter
{
void MoreInfo\u单击(对象发送者,System.EventArgs e)
{
var item=((发送者作为视图).Tag作为ViewHolderItem.item;
Log.Debug(“标记”,item.ProdName);
var itemString=string.Format($“{item.ProdkeyID_str}:{item.ProdName}:{item.ProdPrice}”);
新建AlertDialog.Builder(上下文).SetMessage(itemString.Create().Show();
}
公共类ViewHolderItem:Java.Lang.Object
{
公共产品表项目;
}
只读列表项;
只读活动上下文;
公共CustomProductViewAdapter(活动上下文、列表项)
{
this.context=上下文;
这个项目=项目;
}
公共覆盖长GetItemId(int位置)
{
返回位置;
}
公共覆盖ProductTableItem此[int位置]
{
获取{返回项目[位置];}
}
公共覆盖整数计数
{
获取{return items.Count;}
}
公共覆盖视图GetView(int位置、视图转换视图、视图组父视图)
{
var-view=convertView;
var项目=项目[位置];
ViewHolderItem viewHolder=null;
如果(视图==null)
{
viewHolder=新的ViewHolderItem
{
项目=项目
};
视图=context.LayoutInflater.Inflate(Resource.Layout.invoicing\u sales\u product\u listview,null);
var moreInfo=view.findviewbyd(Resource.Id.more\u info);
Tag=viewHolder;
moreInfo.Click+=moreInfo\u Click;
}
var moreInfo2=view.findviewbyd(Resource.Id.more\u info);
viewHolder=moreInfo2.标记为ViewHolderItem;
viewHolder.Item=Item;
view.findviewbyd(Resource.Id.product\u name).Text=item.ProdName;
view.FindViewById(Resource.Id.product\u mrpvalue).Text=item.ProdPrice;
view.findviewbyd(Resource.Id.product\bbvalue).Text=item.ProdPrice2;
view.FindViewById(Resource.Id.product_savingsvalue).Text=“额外信息”;
view.findviewbyd(Resource.Id.product\u value).Text=“更多信息”;
返回视图;
}
}
}您应该在验证视图是否为空的
if
中使用tourViewHolderItem
初始化,并稍微简化代码
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;
}
public override View GetView(int位置、视图转换视图、视图组父视图)
{
var view=convertView??context.LayoutInflater.Inflate(Resource.Layout.invoicing\u sales\u product\u listview,null);
var项目=项目[位置];
ViewHolderItem viewHolder=新ViewHolderItem
{
项目=项目
};
var moreInfo=view.findviewbyd(Resource.Id.more\u info);
Tag=viewHolder;
moreInfo.Click+=moreInfo\u Click;
var moreInfo2=view.findviewbyd(Resource.Id.more\u info);
viewHolder=moreInfo2.标记为ViewHolderItem;
viewHolder.Item=Item;
view.findviewbyd(Resource.Id.product\u name).Text=item.ProdName;
view.FindViewById(Resource.Id.product\u mrpvalue).Text=item.ProdPrice;
view.findviewbyd(Resource.Id.product\bbvalue).Text=item.ProdPrice2;
view.FindViewById(Resource.Id.product_savingsvalue).Text=“额外信息”;
view.findviewbyd(Resource.Id.product\u value).Text=“更多信息”;
返回视图;
}
if(view==null)
不再是必需的,因为您要确保始终有一个包含方法第一行的视图实例
您不需要将viewHolder
设置为null,然后创建实例
希望这能起作用。我用您的CustomProductViewAdapter加载listView,它对我有效,我没有找到System.NullReferenceException。那么您能分享一个简单的listView演示吗?