【问题标题】:ClassCastException on getCursor() of a CursorAdapter when the ListView has a footer当 ListView 有页脚时,CursorAdapter 的 getCursor() 上出现 ClassCastException
【发布时间】:2012-04-30 15:05:59
【问题描述】:

我有一个带有自定义适配器的 ListView,它扩展了 CursorAdapter。 ListView 也有一个页脚视图

在 OnListItemClickListener 中单击列表项(不是页脚)时 我得到一个 ClassCastException

Cursor c = ((CursorAdapter)l.getAdapter()).getCursor();

E/AndroidRuntime( 8579): FATAL EXCEPTION: main
E/AndroidRuntime( 8579): java.lang.ClassCastException: android.widget.HeaderViewListAdapter
E/AndroidRuntime( 8579):        at com.gbenhaim.dealsapp.BrowsePostsActivity.onListItemClick(BrowsePostsActivity.java:277)
E/AndroidRuntime( 8579):        at android.app.ListActivity$2.onItemClick(ListActivity.java:319)
E/AndroidRuntime( 8579):        at android.widget.AdapterView.performItemClick(AdapterView.java:284)
E/AndroidRuntime( 8579):        at android.widget.ListView.performItemClick(ListView.java:3513)
E/AndroidRuntime( 8579):        at android.widget.AbsListView$PerformClick.run(AbsListView.java:1812)
E/AndroidRuntime( 8579):        at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime( 8579):        at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime( 8579):        at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime( 8579):        at android.app.ActivityThread.main(ActivityThread.java:3683)
E/AndroidRuntime( 8579):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 8579):        at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime( 8579):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
E/AndroidRuntime( 8579):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
E/AndroidRuntime( 8579):        at dalvik.system.NativeStart.main(Native Method)

在设置适配器之前,页脚视图被膨胀并添加到列表视图中。

点击页脚可以正常工作 如果我不将页脚添加到列表视图中,则单击列表项可以正常工作

问题是什么,我该如何解决?

编辑: 我的自定义适配器扩展了 CursorAdapter 并覆盖了 BindView 和 NewView

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
if (v == footer) {
    ...
} else {
        Cursor c = ((CursorAdapter) l.getAdapter()).getCursor();
        c.moveToPosition(position); 
        ...
    }
}

class PostAdapter extends CursorAdapter {

    public PostAdapter(Context context, Cursor c) {
        super(context, c);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        // DISPLAY DATA in view
                    ...
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = LayoutInflater.from(context);
        return inflater.inflate(R.layout.postrow, parent, false);
    }
}

【问题讨论】:

    标签: android


    【解决方案1】:

    从错误的外观来看,它似乎不同意您的 HeaderViewListAdapter 可以强制转换为 CursorAdapter。

    您为什么不向我们展示一些您的 HeaderViewListAdapter 的代码?

    编辑:似乎因为您的 ListView 中有页眉/页脚,所以您返回的适配器是一个 HeadListViewAdapter,它包装了您的原始适配器。

    来自 Android 开发 API:

    HeaderViewListAdapter
    
    ListAdapter used when a ListView has header views. This ListAdapter wraps another one and also keeps track of the header views and their associated data objects. 
    

    http://developer.android.com/reference/android/widget/HeaderViewListAdapter.html

    以下都是有根据的猜测,但请尝试一下:

    1. l.getAdapter

    2. ((HeaderListViewAdapter)l.getAdapter).getWrappedAdapter()

    所以不要这样:Cursor c = ((CursorAdapter) l.getAdapter()).getCursor();

    试试这个:

    HeaderViewListAdapter hlva = (HeaderViewListAdapter)l.getAdapter();
    PostAdapter postAdapter = (PostAdapter)hlva.getWrappedAdapter();
    Cursor cur = postAdapter.getCursor();
    

    我把它分解了,这样如果它不起作用,你就会确切地知道哪个语句出错了。

    【讨论】:

    • 我没有HeaderViewListAdapter,只是一个扩展CursorAdapter的自定义适配器
    • 奇怪?该错误特别指出 HeaderViewListAdapter。好的,那你为什么不向我们展示你的自定义适配器的代码呢?
    • 我也是。我喜欢回答关于 SO 的问题的部分原因是因为我经常自己学到一些新东西。
    • @Gophermofur 你是救生员!谢谢
    【解决方案2】:

    它显然不喜欢你的演员表。没有看到代码,这几乎是猜测,但这里是。

    尝试改变这个:

    Cursor c = ((CursorAdapter)l.getAdapter()).getCursor();
    

    到这里:

    Cursor c = ((CursorAdapter)((ListView)l).getAdapter()).getCursor();
    

    或者,如果 HeaderViewListAdapter 不是 CursorAdapter 的扩展,试试:

    Cursor c = ((HeaderViewListAdapter)((ListView)l).getAdapter()).getCursor();
    

    【讨论】:

    • 第一个抛出相同的异常,第二个不起作用:方法 getCursor() 没有为 HeaderViewListAdapter 类型定义
    • 抱歉,我真的认为其中一个会起作用。也许在您的问题中添加一些代码以帮助澄清问题。
    • 添加了监听器的代码,适配器本身只是扩展了CursorAdapter并覆盖了BindView和NewView
    猜你喜欢
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2016-10-08
    • 1970-01-01
    相关资源
    最近更新 更多