我有一个应用程序,我在片段中显示列表视图。但是,在创建列表视图时,我得到了一个空引用异常。我不确定为什么,因为在其他片段上工作得很好。这是我的片段和布局页面。
片段:
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();
}
}
}
答案 0 :(得分:1)
OnCreateView
方法使视图无效并将其返回(使用return view;
)以添加到片段。您在返回视图以添加到LoadWishlist();
之前呼叫Fragment
- 此时您的view
未添加到任何地方,因此您无法使用FindViewById
(没有布局)
LoadWishlist();
可能应该在OnViewCreated
方法中调用。或者在OnCreateView
内,您可以引用ListView
并传递给LoadWishlist(ListView listViewWishlist)
(然后移除var listViewWishlist = View.FindViewById...
行)