Xamarin Android自定义列表视图错误

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) {

在自定义listview中,我不断获取System.NullReferenceException:对象引用未设置为对象的实例。在该viewholder上。item=item

我完全不知道为什么会这样

   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
中使用tour
ViewHolderItem
初始化,并稍微简化代码

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演示吗?