我有一个我从没想过会看到的例外。从 ListView (sic) 中删除页脚视图时适配器的类转换异常。
java.lang.ClassCastException: com.test.MyAdapter
at android.widget.ListView.removeFooterView(ListView.java:381)
这怎么可能发生?删除页脚与类转换异常有什么关系????
该列表是一个多列表适配器,也许这就是为什么但仍然是删除页脚(原文如此)的类转换异常。
我有一个我从没想过会看到的例外。从 ListView (sic) 中删除页脚视图时适配器的类转换异常。
java.lang.ClassCastException: com.test.MyAdapter
at android.widget.ListView.removeFooterView(ListView.java:381)
这怎么可能发生?删除页脚与类转换异常有什么关系????
该列表是一个多列表适配器,也许这就是为什么但仍然是删除页脚(原文如此)的类转换异常。
ListView
在调用setAdapter()
方法之前添加您的页脚视图。
添加:
public void addFooterView (View v)
自:API 级别 1 添加一个固定视图以显示在列表底部。如果 addFooterView 被多次调用,视图将按照它们添加的顺序出现。如果需要,使用此调用添加的视图可以成为焦点。
注意:在调用 setAdapter 之前调用它。这样 ListView 就可以将提供的光标与一个也将考虑页眉和页脚视图的光标包装起来。
参数 v 要添加的视图。
您也可以查看这个有趣的帖子。
希望这可以帮助。
这是上面答案的一些代码,它适用于我的情况:
在设置它的适配器之前,我必须为我的 listView 设置一个 footerView(它是一个带有分页的 listView 中的 loadingView),然后将其删除。首先,我从 OnCreate 方法中的布局文件初始化了 loadingView:
LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
loadingView = layoutInflater.inflate(R.layout.loading_view, null);
然后我以相同的方法使用了这个解决方法:
this.setIsLoading(true);
listView.setAdapter(adapter);
this.setIsLoading(false);
在哪里
private void setIsLoading(boolean isLoading)
{
this.isLoading = isLoading;
if (isLoading) {
listView.addFooterView(loadingView);
}
else {
listView.removeFooterView(loadingView);
}
}
问题不是来自removeFooterView()
,而是来自addFooterView()
。如果您阅读文档,它会声明将包装器添加到您的适配器中:
如果 ListView 的适配器没有扩展 HeaderViewListAdapter,它将使用 WrapperListAdapter 的支持实例进行包装。
因此,您必须使用 getter 来检索包装好的适配器并将其转换为您的适配器。像这样:
((MyAdapter) ((HeaderViewListAdapter) listView.getAdapter()).getWrappedAdapter())
希望这将帮助您解决您的问题。
此致,
添加到其他答案中,如果您要动态添加/删除页脚(例如,如果它们到达列表的底部,然后您要添加页脚视图),最简单的方法是覆盖setAdapter
并ListView
添加一个新的 View 对象作为那里的页脚,这将确保适配器被包裹在HeaderViewListAdapter
:
@Override
public void setAdapter(ListAdapter adapter) {
addFooterView(new View(getContext()));
super.setAdapter(adapter);
}