1


同様の問題がいくつか見つかりましたが、問題として指摘されたものはすべてここには当てはまらないようです。
データプロバイダーとして MatrixCursor と SimpleCursorAdapter を持つ ListView があります。リスト アイテム スタイルは 1 つだけで、ヘッダーやフッターなどはありません。リストをすばやく上下にスクロールすると、おそらくリストの一番上にバウンスするときにのみ、スタック トレースにアプリケーション コードがなくても IndexOutOfBounds 例外が発生することがあります。だから捕まえることもできない。
これは、Huawei Ideos U8510 / Android 2.3.3 および Acer Iconia Tab A510 / Android 4.1.2 で発生します (少なくともテスト済み)。
修正または回避する方法を教えてください。
ティア

02-05 10:17:12.980: E/AndroidRuntime(1517): FATAL EXCEPTION: main
02-05 10:17:12.980: E/AndroidRuntime(1517): java.lang.ArrayIndexOutOfBoundsException
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.MotionEvent.getY(MotionEvent.java:903)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.widget.AbsListView.onTouchEvent(AbsListView.java:2189)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.widget.ListView.onTouchEvent(ListView.java:3486)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.View.dispatchTouchEvent(View.java:3885)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1693)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1125)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.app.Activity.dispatchTouchEvent(Activity.java:2096)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1677)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2257)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1881)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.os.Looper.loop(Looper.java:123)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.app.ActivityThread.main(ActivityThread.java:3695)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at java.lang.reflect.Method.invokeNative(Native Method)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at java.lang.reflect.Method.invoke(Method.java:507)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at dalvik.system.NativeStart.main(Native Method)
4

2 に答える 2

2

ListView.onTouchEvent() を再実装することで修正しました。コードを共有すると思いました:

public class MyListView extends ListView 
{

    public MyListView(Context context) 
    {
        super(context);
    }

    public MyListView(Context context, AttributeSet attrs) 
    {
        super(context, attrs);
    }

    public MyListView(Context context, AttributeSet attrs, int defStyle) 
    {
        super(context, attrs, defStyle);
    }

    @Override public boolean onTouchEvent(MotionEvent ev)
    {
        try { return super.onTouchEvent(ev); }
        catch(ArrayIndexOutOfBoundsException e)
        {
            Log.w("Catched ArrayIndexOutOfBoundsException");
            return true; // handled
        }       
    }   
}

layout.xml ファイルで <ListView> の代わりに <Your.path.to.MyListView> を使用する必要があります。

于 2013-02-08T09:18:50.063 に答える
0

プログラムが要素にアクセスしようとしているArrayArrayList、特定のインデックスで listView のアダプタを設定していました。しかし、そのインデックスの要素は初期化されていません。

カスタム アダプターを使用してリストを設定している場合getCount()は、アダプター クラスのメソッドが返す内容を確認してください。Arrayリストの設定に使用したまたはのサイズを返す必要がありArrayListます。

于 2013-02-05T09:52:05.433 に答える