【问题标题】:Custom ListView Adapter throws UnsupportedOperationException自定义 ListView 适配器抛出 UnsupportedOperationException
【发布时间】:2012-09-19 11:53:23
【问题描述】:

This is the tutorial that I followed 使用自定义 Listview 适配器。我遇到的问题是,当我尝试清除适配器时,应用程序崩溃并抛出 java.lang.UnsupportedOperationException

if(adapter != null) {
    adapter.clear();
}

更新代码:

private void setListViewAdapterToDate(int month, int year, int dv)
{
     if(summaryAdapter != null) {
        summaryAdapter.clear();
     }

    setListView(month, year, dv);
    summaryList.addAll(Arrays.asList(summary_data));
    summaryAdapter = new SummaryAdapter(this.getActivity().getApplicationContext(), R.layout.listview_item_row, summaryList);


    summaryAdapter.notifyDataSetChanged();
    calendarSummary.setAdapter(summaryAdapter);
}

【问题讨论】:

  • 有关何时调用 adapter.clear() 的更多上下文会有所帮助。也许您在线程内部调用它。如果不是太长,我会发布您的所有代码。如果是,只是周围的代码。此外,发布您在日志中看到的整个错误堆栈跟踪。

标签: java android listview adapter


【解决方案1】:

环顾四周,似乎用数组初始化适配器是个问题。见UnsupportedOperationException with ArrayAdapter.removeUnable to modify ArrayAdapter in ListView: UnsupportedOperationException

尝试使用ArrayList,而不是像这样的array

ArrayList<Weather> weather_data = new ArrayList<Weather>()
weather_data.add( new Weather(R.drawable.weather_cloudy, "Cloudy") );
// continue for the rest of your Weather items.

如果您觉得懒惰,可以通过这种方式将您的 array 转换为 ArrayList

ArrayList<Weather> weatherList = new ArrayList<Weather>();
weatherList.addAll(Arrays.asList(weather_data));

要在WeatherAdapter 类中完成到ArrayList 的转换,您需要删除Weather data[] = null; 及其所有引用(例如在构造函数中),因为ArrayAdapter 为您保存数据,您可以使用getItem访问它

因此,在您的 getView 函数中,您可以将 Weather weather = data[position]; 更改为 Weather weather = getItem(position);

更新 修改你的更新代码

private void setListViewAdapterToDate(int month, int year, int dv)
{
    setListView(month, year, dv); 
     if(summaryAdapter != null) {
        summaryAdapter.clear();
        summaryAdapter.addAll( summaryList );
        summaryAdapter.notifyDataSetChanged();
     } else {
         summaryList.addAll(Arrays.asList(summary_data));
         summaryAdapter = new SummaryAdapter(this.getActivity().getApplicationContext(), R.layout.listview_item_row, summaryList);
     }
    calendarSummary.setAdapter(summaryAdapter);
}

【讨论】:

  • 非常感谢您的详细回复。现在唯一的事情是,当我尝试清除ArrayList 时,它仍然没有清除,而是附加到上一个列表中。我已经用代码更新了问题。请检查。
  • 您仍然应该使用 adapter.clear() 方法而不是列表。 adapter.clear() 仍然给你错误吗?顺便说一句,我编辑了我的答案几次,所以你现在可能已经看到了最新的。
  • 不,它现在没有报错。它现在所做的只是将先前的列表数据附加到当前列表数据,而不是刷新/替换它。
  • 你在使用adapter.clear();吗?您在上面发布的代码是weatherList.clear();
  • 使用数组列表和数组有什么区别??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多