在ListView android中使用Fragment时出现NullReferenceException

时间:2017-05-23 14:10:43

标签: c# android listview xamarin

我有一个应用程序,我在片段中显示列表视图。但是,在创建列表视图时,我得到了一个空引用异常。我不确定为什么,因为在其他片段上工作得很好。这是我的片段和布局页面。

片段:

map

xml:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;
using CardAppReal.Assets;
using CardAppReal.Lib.Models;
using SQLite;
using Environment = System.Environment;
using Fragment = Android.Support.V4.App.Fragment;

namespace NavigationDrawerTest.Fragments
{
    public class WishlistFragment : Fragment
    {
        private List<Card> _cards;

        public WishlistFragment()
        {
            this.RetainInstance = true;
        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            // Use this to return your custom view for this Fragment
            // return inflater.Inflate(Resource.Layout.YourFragment, container, false);
            base.OnCreateView(inflater, container, savedInstanceState);
            var view = inflater.Inflate(Resource.Layout.WishlistPage, null);
            LoadWishlist();
            return view;
        }

        private void ListViewCards_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
        {
            Android.Support.V4.App.Fragment fragment = null;
            var listView = sender as ListView;
            var t = _cards[e.Position];
            Android.Widget.Toast.MakeText(this.Activity, t.name, Android.Widget.ToastLength.Short).Show();
            Bundle bundle = new Bundle();
            bundle.PutString("Id", t.id);
            fragment = new CardDetailFragment();
            fragment.Arguments = bundle;
            FragmentManager.BeginTransaction().Replace(Resource.Id.content_frame, fragment).Commit();

        }

        private async void LoadWishlist()
        {
            string folder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal),
                "database.db3");
            var db = new SQLiteConnection(folder);
            var table = db.Table<Card>();
            _cards = new List<Card>();
            foreach (var card in table)
            {
                _cards.Add(card);
            }
            var adapter = new CardsAdapter(this.Activity, _cards);

            var listViewWishlist = View.FindViewById<ListView>(Resource.Id.ListViewWishlist);

            listViewWishlist.Adapter = adapter;
            listViewWishlist.ItemClick += ListViewCards_ItemClick;

        }
    }
}

修改

这是一个可行的片段。

片段:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">



  <ListView
    android:minWidth="25px"
    android:minHeight="25px"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/ListViewWishlist" />
</LinearLayout>

xml:

using System.Collections.Generic;
using System.Threading.Tasks;
using Android.OS;
using Android.Views;
using Android.Widget;
using CardAppReal.Assets;
using CardAppReal.Lib.Models;
using CardAppReal.Lib.Repositories;
using CardAppReal.Lib.Services;
using Fragment = Android.Support.V4.App.Fragment;

namespace NavigationDrawerTest.Fragments
{
    public class SerieFragment : Fragment
    {
        public List<Serie> Series { get; set; }
        public SerieFragment()
        {
            this.RetainInstance = true;
        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {

            base.OnCreateView(inflater, container, savedInstanceState);
            var view = inflater.Inflate(Resource.Layout.SeriePage, null);
            LoadSeries();

            return view ;
        }

        public void OnBackPressed()
        {
            FragmentManager.PopBackStack();
        }
        private async Task LoadSeries()
        {
            SerieDataService serieDataService = new SerieDataService(new SerieRepo());
            Series = await serieDataService.GetSeriesAsync();
            var context = this.Activity;
            var listViewSeries = View.FindViewById<ListView>(Resource.Id.ListViewSeries);
            listViewSeries.Adapter = new HomeScreenAdapter(context, Series);
            listViewSeries.ItemClick += OnSerieListItemClick;
        }

        private void OnSerieListItemClick(object sender, AdapterView.ItemClickEventArgs e)
        {
            Android.Support.V4.App.Fragment fragment = null;
            var listView = sender as ListView;
            var t = Series[e.Position];
            Android.Widget.Toast.MakeText(this.Activity, t.Series, Android.Widget.ToastLength.Short).Show();
            Bundle bundle = new Bundle();
            bundle.PutString("Serie", t.Series);
            fragment = new SetFragment();
            fragment.Arguments = bundle;
            FragmentManager.BeginTransaction().Replace(Resource.Id.content_frame, fragment).Commit();

        }


    }
}

1 个答案:

答案 0 :(得分:1)

OnCreateView方法使视图无效并将其返回(使用return view;)以添加到片段。您在返回视图以添加到LoadWishlist();之前呼叫Fragment - 此时您的view未添加到任何地方,因此您无法使用FindViewById(没有布局)

LoadWishlist();可能应该在OnViewCreated方法中调用。或者在OnCreateView内,您可以引用ListView并传递给LoadWishlist(ListView listViewWishlist)(然后移除var listViewWishlist = View.FindViewById...行)