0

CursorAdapter を拡張するカスタム アダプターを備えた ListView があります。その 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);
    }
}
4

2 に答える 2

12

エラーの外観から、HeaderViewListAdapter を CursorAdapter にキャストできることに同意していないようです。

HeaderViewListAdapter のコードをいくつか見せてください。

編集: ListView にヘッダー/フッターがあるため、元のアダプターをラップする HeadListViewAdapter が返されるアダプターのようです。

Android Dev 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 <-- HeaderListViewAdapter

  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();

それが機能しない場合に、どのステートメントがエラーになっているのかを正確に知ることができるように、私はそれを分割しました。

于 2012-04-30T15:12:17.393 に答える
1

どうやらあなたのキャストが好きではありません。コードを見なければ、ほとんど当て推量ですが、これで終わりです。

これを変更してみてください:

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

これに:

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

または、HeaderViewListAdapter が CursorAdapter の拡張でない場合は、次を試してください。

Cursor c = ((HeaderViewListAdapter)((ListView)l).getAdapter()).getCursor();
于 2012-04-30T15:19:13.517 に答える