2017-05-31 7 views
1

私のカスタムリストビューでは、私はSystem.NullReferenceExceptionを取得し続ける:オブジェクト参照がオブジェクトのインスタンスに設定されていません。そのビューホルダーに。item = itemXamarin 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デモを共有できますか? –

答えて

1

あなたは、ビューがnullで、少しコードを簡素化する場合は検証するif外のツアーViewHolderItem intitializationを取る必要があります。あなたは常にメソッドの最初の行を持つビューのインスタンスを持っていることを確認作っているよう

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に設定してインスタンスを作成する必要はありません。

これはうまくいきます。

関連する問題