2010-12-14 4 views
2

ボタンを含むリストビューを使用しているアクティビティで、非常に奇妙な問題が発生しています。リストビュー内のボタンを使用している奇妙なIndexOUBException

このエラーはランダムに表示されるようですが(実際には存在しないことは分かっていますが)、エラーを再現するために定義されたパターンを得ることはできません。それはちょうど毎回起こります。

私がこれを理解しようとしている大きな問題は、logCatが自分のコードにエラーを表示していないことです。ちょうどそのコードがアンドロイドでクリックが発生しているビューを特定するために使用します。 android/javaに属していないパッケージはエラーに言及されていないことに注意してください。

LogCat:

12-14 12:04:20.994: ERROR/AndroidRuntime(5619): FATAL EXCEPTION: main 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619): java.lang.IndexOutOfBoundsException 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at java.util.Arrays$ArrayList.get(Arrays.java:77) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:298) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:351) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.Spinner.makeAndAddView(Spinner.java:189) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.Spinner.layout(Spinner.java:148) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.Spinner.onLayout(Spinner.java:112) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.view.View.layout(View.java:7032) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1042) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.view.View.layout(View.java:7032) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1238) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1044) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.view.View.layout(View.java:7032) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1042) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.view.View.layout(View.java:7032) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.view.View.layout(View.java:7032) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1042) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.view.View.layout(View.java:7032) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.view.View.layout(View.java:7032) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1055) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1737) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.os.Looper.loop(Looper.java:123) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at java.lang.reflect.Method.invoke(Method.java:521) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
12-14 12:04:20.994: ERROR/AndroidRuntime(5619):  at dalvik.system.NativeStart.main(Native Method) 

ここに私のカスタムArrayAdapterコードは、私はしっかりとそれらをクリックして、ほとんど場合、私は、繰り返し様々な行から様々な「boton_modificar」をクリックしたときにエラーが発生し、あります。

private class CustomAdapter extends ArrayAdapter<DataType> { 

    public CustomAdapter(Context context, int resource,List<DataType> objects) { 
    super(context, resource, objects); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 

    final int position2 = position; 

    if (row == null) { 
    LayoutInflater inflater = getLayoutInflater(); 
    row = inflater.inflate(R.layout.row_layout,parent,false); 
    } 

    //Some more code here 

    ImageButton boton_modificar = (ImageButton) row.findViewById(R.id.modificar); 
    boton_modificar.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
    DataT t = tr.get(position2); 
    ((EditText) (findViewById(R.id.monto))).setText(Double.toString(t.m)); 
    ((Spinner) (findViewById(R.id.spinnerTipoB))).setSelection(t.posSTB); 
    ((Spinner) (findViewById(R.id.spinnerB))).setSelection(t.posSB); 
    } 
    }); 
    return (row); 
    } 
} 

anybodeはこれが何であるかを少し考えていますか?私はこれを何とか理解しようと疲れました。ほとんどの私は、同様の問題のバグレポートでしたが、私はその同じことを疑う、事前にどのような場合でthe report is here.

おかげで、ステファノ

編集:ちょうどエラーポップ前の

LogCatポジションセットと何か関係があるのか​​疑問に思う。

12-16 15:12:56.159: INFO/position2(21828): 7 
12-16 15:12:56.159: INFO/Spinner A # elements:(21828): 3 
12-16 15:12:56.159: INFO/Assigned position(21828): 1 
12-16 15:12:56.159: INFO/Spinner B # elements:(21828): 20 
12-16 15:12:56.159: INFO/Assigned position(21828): 5 

追加コード:

spinnerTipoB.setOnItemSelectedListener(new OnItemSelectedListener() { 
        @Override 
        public void onItemSelected(AdapterView<?> arg0, View arg1, 
          int position, long arg3) { 
         int posId = tipoBIds[position]; 
         if (posId == 0) { 
           spinnerB.setAdapter(arrayAdapterBP); 
         } else if (posId == 1) { 
          spinnerB.setAdapter(arrayAdapterBT); 
         } else if (posId == 2) { 
          spinnerB.setAdapter(arrayAdapterBO); 
         } 
        } 

        @Override 
        public void onNothingSelected(AdapterView<?> arg0) { 
         // Do Nothing 
        } 
       }); 

spinnerBはセレクト位置に何もしません。 spinnerB.setAdapter(arrayAdapterNAME)が行われる前に((Spinner) (findViewById(R.id.spinnerB))).setSelection(t.posSB);が実行されるので、私はエラーocurrsを推定でしょう

arrayAdapterNAME = new ArrayAdapter<String>(this, R.layout.layoutspinner, DATA); 

: すべてのスピナー・アレイ・アダプタは、このように作成されますか?

+0

どこにもヘッダーとフッターがありません。 'tr'はArrayListであり、データはそこにあり、NPEを取得していません。私のコードは、それがクラッシュすると、その行に到達することさえないので、clickListenerを入力する前にそれを行います。 – blindstuff

+0

'onClick'メソッド内の' position2'が 'LogCat'にログすることによって適切な整数値であることを確認してください。 2つの 'setSelection'メソッド呼び出しの近くに問題があるように見えます。 – binnyb

+0

'position2'は、この' getView'メソッドの内部にある 'onClick'イベントメソッドの中で内部からアクセスされているので、あなたが思っているものではないと感じています。私は自分自身のプロジェクトでこの問題を回避しましたが、もしあなたが 'position2'が期待通りではないことが分かったら教えてください – binnyb

答えて

3

この問題は、ListView'sアダプターと、Spinnerアダプターのすべてと関係がありません。

いずれかのボタンをクリックすると、両方のスピナーでsetSelection()と呼びます。 AbsSpinner.setSelection(int)のコードをチェックすると、新しく選択されたアイテムの整数インデックスがキャッシュされ、requestLayout()が呼び出されて(後で)再描画されます。

UIスレッドがレイアウトメッセージを処理すると、ビューツリーのすべてがレイアウトされますが、Spinnerのレイアウト時には、前にキャッシュされたインデックスが有効ではなくなってしまうため、吹き飛ばされます。何かがアダプタのリストを変更しました...これは、Button onClick()などのUIイベントに応答して発生し、レイアウトメッセージが処理される前に処理されているに違いありません。

追加された後続のコメント議論とO.Pに追加されたコード

Spinner.setSelection()が返される前にonItemSelectedListenerイベントが実行されるという誤った仮定がありました。この特定の問題の修正は、ボタンonClick()からスピナー・アダプターを設定し、その後に選択された索引を設定することでした。

関連する問題