【问题标题】:Spinner Adapter - Xamarin Android微调器适配器 - Xamarin Android
【发布时间】:2020-06-03 21:53:59
【问题描述】:

我的spinneradapter 有问题,它从SQLite 数据库 获取数据并尝试显示一堆字符串作为微调器的结果。

它向我发送以下错误消息:

“抛出了 'Java.Lang.NullPointerException' 类型的异常。”
当我在应用程序运行的情况下单击微调器时,如果它不在 try/catch 中,应用程序将冻结。

谁能帮我找出问题所在?代码如下:

活动代码

private string[] _companyNames;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            SetContentView(Resource.Layout.a_plant);

            Spinner spCompanyName = FindViewById<Spinner>(Resource.Id.spCompanyName);
            EditText etPlantName = FindViewById<EditText>(Resource.Id.etPlantName);

            Button btnAdd = FindViewById<Button>(Resource.Id.btnAdd);
            Button btnSearch = FindViewById<Button>(Resource.Id.btnSearch);

            //Adds data to the spinner only if they dont exist already
            DBManager.LoadCompanySpinner(_companyNames);

            //shows data on spinner
            try
            {
                //THIS IS WHERE THE EXCEPTION IS CAUGHT
                ArrayAdapter<string> adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleSpinnerDropDownItem, _companyNames);
                //
                adapter.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem);
                spCompanyName.Adapter = adapter;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

DBManagerspinner上添加数据的代码

我相信这段代码可以工作,因为它会在控制台上打印结果。

//insert data in spinner
        public static void LoadCompanySpinner(string[] l)
        {
            var t = DBManager.Instance.Query<Company>("Select CompanyName from company");
            int size = t.Count;
            if(size > 0)
            {
                l = new string[size + 1];
                l[0] = "Select Company...";
                for (var i = 0; i < size; i++)
                {
                    l[i + 1] = t[i].CompanyName;
                    Console.WriteLine("added " + t[i].CompanyName);
                }
            }
        }

【问题讨论】:

  • 您是否检查了该行中的每个项目的非空值?
  • @Jason 你能告诉我该怎么做吗?
  • 使用调试器在该行添加断点并检查每个值
  • @Jason 它只是不让我通过适配器创建行,它在我第一次通过它时抛出异常
  • 你没有通过它,你停止它并检查每个参数。

标签: c# android xamarin spinner adapter


【解决方案1】:

我终于修好了!

我将array 更改为List&lt;string&gt;,因为错误出现在string[] _companyNames 中,因为我从未分配过Length,该值将始终为Null,因此导致:

Java.Lang.NullPointerException

我永远不能使用具有静态长度的数组,因为我总是需要添加新值,因此具有动态长度的列表应该是最佳选择。

这是最终结果:

关于活动->

更改:private string[] _companyNames;List&lt;string&gt; _companyNames = new List&lt;string&gt;();

全局活动进行了一些更改,因此它可以与列表一起使用:

public static void LoadCompanySpinner(List<string> l)
        {
            var t = DBManager.Instance.Query<Company>("Select CompanyName from company");
            int size = t.Count;
            if(size > 0)
            {
                l.Add("Select Company ... ");
                for (var i = 0; i < size; i++)
                {
                    l.Add(t[i].CompanyName);
                    Console.WriteLine("added " + t[i].CompanyName);
                }
            }
        }

感谢您的提示!

【讨论】:

  • 感谢您的分享,请不要忘记接受您的回答,它将帮助其他有类似问题的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
相关资源
最近更新 更多