ArrayAdapter 的应用程序崩溃,因为 Array 为空

Posted

技术标签:

【中文标题】ArrayAdapter 的应用程序崩溃,因为 Array 为空【英文标题】:App crash as Array is null for ArrayAdapter 【发布时间】:2017-02-25 21:56:22 【问题描述】:

我是 android 编程新手,所以你需要忍受我。

我正在尝试从解析服务器检索列并将其显示在 ListView 中。到目前为止,我已经生成了以下代码,但是我遇到了一个问题。在我的 for 循环中,它应该从“Absences”类的“name”列中获取每个项目,并将其添加到名为“teachers”的 ArrayList 中。

问题是应用程序崩溃,因为数组为空(在日志中打印后),因此无法将其分配给 ArrayAdapter。我相信这样做的原因是在执行 arrayadapter 代码后的某个时间在后台获取对象,这意味着它试图显示一个空数组。

我假设我需要以某种方式推迟它 - 关于我应该做什么的任何想法?

onCreate() 方法中受影响的代码:

    final ArrayList<String> teachers = new ArrayList<String>();

    ParseQuery<ParseObject> query = ParseQuery.getQuery("Absences");

    query.findInBackground(new FindCallback<ParseObject>() 
        @Override
        public void done(List<ParseObject> objects, ParseException e) 
            if(e == null)

                for(ParseObject object : objects)

                    String name = String.valueOf(object.get("name"));
                    Log.i("teacherName", name);
                    teachers.add(name);

                

             else 

                Log.i("Get data from parse", "There was an error getting data!");
                e.printStackTrace();

            
        
    );

    Log.i("teacherOutput", teachers.toString());

    final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, teachers);

    ListView lv = (ListView)findViewById(R.id.listView);

    lv.setAdapter(arrayAdapter);

非常感谢!

【问题讨论】:

【参考方案1】:

您需要了解 asynchronous 的含义。

你的代码应该是这样的:

    final ListView lv = (ListView) findViewById(R.id.listView);
    query.findInBackground(new FindCallback<ParseObject>() 
        @Override
        public void done(List<ParseObject> objects, ParseException e) 
            if (e == null) 
                ArrayList<String> teachers = new ArrayList<String>();
                for (ParseObject object : objects) 
                    String name = String.valueOf(object.get("name"));
                    Log.i("teacherName", name);
                    teachers.add(name);
                
                final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, teachers);
                lv.setAdapter(arrayAdapter);
             else 
                Log.i("Get data from parse", "There was an error getting data!");
                e.printStackTrace();
            
        
    );

【讨论】:

我仍然收到以下错误:“尝试在空对象引用上调用虚拟方法 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)'” 您的布局文件中可能没有ListView id = listView 啊,就是这样 - ListView 在错误的布局文件中!谢谢!

以上是关于ArrayAdapter 的应用程序崩溃,因为 Array 为空的主要内容,如果未能解决你的问题,请参考以下文章

无法在 ListView 中修改 ArrayAdapter:UnsupportedOperationException

无法在 ListView 中修改 ArrayAdapter:UnsupportedOperationException

如何实现 Asynctask 在 ArrayAdapter 中加载图像

Android Studio:有没有办法更改 ArrayAdapter 上显示的文本?

ArrayAdapter的使用

ArrayAdapter,SimpleAdapter