【问题标题】:ClassCastException with ListView when executing notifyDataSetChanged执行 notifyDataSetChanged 时 ListView 出现 ClassCastException
【发布时间】:2011-05-23 04:41:51
【问题描述】:

我在 listVivew 的标题中添加了一个视图,

    View TopSearch =  (View) View.inflate(this, R.layout.search, null);
    lv.addHeaderView(TopSearch, null, false);

一切都很好,直到我尝试执行(当数据更改时)

adapter.notifyDataSetChanged();

这总是让我的应用程序崩溃,给我以下错误:

> java.lang.ClassCastException: android.widget.HeaderViewListAdapter

如果我删除标题视图,则没有错误。有什么建议?谢谢。

【问题讨论】:

标签: listview header dataset adapter notify


【解决方案1】:
public class YourOwnList extends ListActivity {
    private EfficientAdapter mAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        mAdapter = new EfficientAdapter(/*your parameters for the adapter*/);
    }

    private void yourMethod () {
        mAdapter.notifyDataSetChanged();
    }

    private static class EfficientAdapter extends CursorAdapter {
        // your adapter
    }
}

【讨论】:

  • 欢迎来到 StackOverflow。始终建议在您发布的代码中添加一两行,这有助于其他成员更好地理解您的代码
【解决方案2】:

似乎每当您在列表视图中使用页眉/页脚视图时,您的 ListView 都会被 HeaderViewListAdapter 包裹起来。您可以使用以下代码解决此问题:

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

【讨论】:

  • 添加页脚视图后,我的 listView.getAdapter() 不是 HeaderViewListAdapter 的实例。
  • 非常感谢。由于我的应用程序结构,我无法遵循以下方法
  • @ono:我认为应该是 FooterViewListAdapter
  • 现在我得到 android.widget.ExpandableListConnector 不能转换为 *
【解决方案3】:

API 18 及更低版本对其包装的内容感到困惑。为了帮助它,请在分配适配器之前设置您的页眉和/或页脚。这样,正确的包装就发生在封面下。然后立即删除页眉/页脚(如果这是你想要的)。

myList.addFooterView(myFooterView);
myList.setAdapter(adapter);
myList.removeFooterView(myFooterView);

【讨论】:

    【解决方案4】:

    @mussharapp 的回答完全正确,而且有效!但是,我发现在执行 setAdapter() 之前将适配器简单地缓存在成员变量上以供以后使用会更方便:

    mAdapter = new YourAdapter(ctx, items);
    listView.addFooterView(v);
    listView.setAdapter(mAdapter);
    

    【讨论】:

      【解决方案5】:

      http://stanllysong.blogspot.ru/2013/08/javalangclasscastexception.html 中所写 应该这样做:

      HeaderViewListAdapter hlva = (HeaderViewListAdapter)l.getAdapter();
      YourListAdapter postAdapter = (YourListAdapter) hlva.getWrappedAdapter();
      postAdapter.notifyDataSetChanged();
      

      【讨论】:

        【解决方案6】:

        类转换异常的原因是listview没有包装到headerlistview。所以我们不能直接在listview中添加页脚或页眉。因此,在将适配器设置为列表视图之前,将虚拟视图添加为页眉或页脚视图。然后将适配器设置为列表视图。这使得 listview 成为 headerviewslist 的实例。然后,您可以像往常一样轻松地从列表视图中添加和删除页脚。

        listview.addFooterView(new View(mContext));listview.setAdapter(yourAdapter): 
        

        设置适配器后,您可以添加或删除页脚 listview.addFooterView(yourFooter);或 listview.removeFooterView(yourFooter);

        【讨论】:

          猜你喜欢
          • 2016-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-07
          • 1970-01-01
          相关资源
          最近更新 更多