向ListView添加页脚会抛出“无法转换为android.widget.HeaderViewListAdapter”

时间:2015-02-05 15:43:46

标签: android listview exception

我正在尝试将一个简单的View作为页脚添加到ListView。 这样做会引发ClassCastException。 ( “cannot be cast to android.widget.HeaderViewListAdapter”)

在您将此标记为无数其他问题的副本之前,请继续阅读,您将理解为什么我会寻求帮助。

我理解在KitKat之前向ListView添加页眉或页脚的必要步骤。 procedure必须是:

  
      
  1. 添加页眉和/或页脚。
  2.   
  3. 然后设置适配器。
  4.   

这样ListView.setAdapter可以根据是否存在任何页眉或页脚来确定是否必须将适配器包装在HeaderViewListAdapter中。 这很简单易懂。

我的问题是,即使我遵循这个程序,我也会抛出异常!

我在两个不同的地方使用我的ListView。

  
      
  1. 标准活动,其中列表是唯一显示的视图。
  2.   
  3. ViewPager中的片段
  4.   

我在两个实例中都遵循相同的步骤,首先添加页眉/页脚,然后设置适配器。

Activity中这很好用,一切都按预期工作 在Fragment中,我收到了ClassCastException

以下是启动两个实例的代码:

ActivityFragment

EndlessList list = (EndlessList) rootView.findViewById(R.id.EndlessListArea);

// Adds the Loading and Error footer
list.setupLoadingView();
list.setupErrorView();

// Sets up the Adapter for the list (View presentation and data management).
list.setAdapter(new listAdapter());

我需要帮助确定该过程为什么与Activity一起使用,但会引发Fragment的异常。


注意:我甚至尝试在HeaderViewListAdapter中实际手动包装适配器,然后将其传递给setAdapter方法,然后添加页眉/页脚。这摆脱了异常,但没有向我的Fragment添加页眉/页脚。代码如下:

HeaderViewListAdapter adp = new HeaderViewListAdapter(null, null, adapter);
super.setAdapter(adp);

3 个答案:

答案 0 :(得分:3)

可能没有足够的代码来回答这个问题,但是您是否知道如果向列表添加页眉或页脚,适配器会自动包装在HeaderViewListAdapter中?

请参阅this question中的答案:

((YourAdapter)((HeaderViewListAdapter)listView.getAdapter()).getWrappedAdapter()).notifyDataSetChanged();

如果在添加页眉或页脚后尝试访问列表的适配器,则会抛出此异常。

答案 1 :(得分:1)

我发现这个问题有轻微的欺骗方式 问题仍然是一个问题,但仍然没有答案。

可以做的是在列表构造期间(添加适配器之前)添加所需的页眉或页脚,然后在运行适配器后运行删除页眉/页脚视图。
这确实增加了一些额外的工作,特别是如果页眉或页脚需要任何inflatinglayout management,但它确实解决了问题。

以下示例代码:

addHeaders();
addFooters();

public void setAdapter(ListAdapter adapter)
{
    super.setAdapter(adapter);

    // Fix for issues with ListView, Fragment and header/footer
    hideAllHeaders();
    hideAllFooters();
}

答案 2 :(得分:0)

在将适配器设置为listview之前,将虚拟视图添加为页眉或页脚视图。然后将适配器设置为listview。这使listview成为headerviewslist的实例。然后,您可以正常地从列表视图中轻松添加和删除页脚。