【问题标题】:List is empty after filling, but spinner shows it has strings填充后列表为空,但微调器显示它有字符串
【发布时间】:2014-04-30 17:37:42
【问题描述】:

我正在获取一个 JSON 对象并在 AsyncTask 中使用 GSON 对其进行解析。 之后,我使用静态 void 将来自 onPostExecute 的列表传递给我的活动中的静态列表。

然后,我遍历该列表并填写另一个列表。 在 onCreate 中,我将该列表调整为 Spinner,并显示选项,但我无法选择它们。

当我尝试使用该列表中的项目 0 时,它会给我 IndexOutOfBounds - 索引 0,大小 0,或者它给我一个 NullPointerException,这取决于我在做什么,但微调器将这些项目显示为存在。如果我使用 .add("something") 添加元素,.size() 会返回 1,但微调器会显示更多元素。

代码如下:

    public  List<City> fetchedList = new ArrayList<City>();   //List that was fetched from JSO
public  List<String> cityList = new ArrayList<String>();  //List of cities derived from fetched list using getCity();
public static String[] countryList;                             //List that is fetched from strings.xml array

//Called from onPostExecute to fill cityList with cities
public void spinner(List<City> lista) {

    fetchedList = lista;
    for (City element : fetchedList) {   //For each City
      cityList.add(element.getCity()); //Get city name and put it into our list

         } }

这里是 onCreate 部分:

   CityFetcher fetch = new CityFetcher(); // Do our asyncTask here
            fetch.execute();               // Run Forrest, run!

    countryList = getResources().getStringArray(R.array.countries);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, cityList);
    ArrayAdapter<String> stringAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, countryList);
    origin.setAdapter(adapter);
    city.setAdapter(stringAdapter);

【问题讨论】:

  • 检查 SetCity () 中的代码。如果在列表中没有值,那么它必须因空指针异常而崩溃。
  • 但是微调器显示它已经有值了。
  • 尝试使用调试器,设置断点并单步执行程序,观察变量的变化。
  • 正在尝试,但无法弄清楚如何在 android studio 中设置断点:\

标签: java android list


【解决方案1】:

您的 AsyncTask 在后台运行,因此当您从 cityList 创建 adapter 时,该列表为空。 尝试在 spinner(List&lt;City) 方法的末尾调用 adapter.notifyDataSetChanged()

这不相关,但最好在spinner(List&lt;City) 的开头调用cityList.clear(),以防您的任务被多次调用。

【讨论】:

  • 我不能在微调器结束时调用它,因为如果我在 onCreate 之外声明它,它会因 IllegalState 而崩溃。试图将它放在 setAdapter 之前,但无济于事。另外,感谢您的提示,请记住这一点:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多