0

リスト項目レイアウトで ImageButtonbindViewのリスナーを接続できるように、オーバーライドしたカスタム SimpleCursorAdapter を作成しました。ボタンがクリックされたときに、基になる からの追加のデータセットをonClick使用して、新しいアプリケーションを開始したいと考えています。IntentCursor

問題はonClick、ボタンの機能が呼び出されると、カーソルがデータベースの正しい行を指していないように見えることです (これは、リストがスクロールするときにカーソルが別の行を指すように変更されたためだと思います)。

これが私のコードです:

private class WaveFxCursorAdapter extends SimpleCursorAdapter {

public WaveFxCursorAdapter(Context context, int layout, Cursor c,
    String[] from, int[] to, int flags) {
    super(context, layout, c, from, to, flags);
}

@Override
public void bindView(View v, Context context, Cursor c) {
    super.bindView(v, context, c);
    ImageButton b = (ImageButton) v.findViewById(R.id.btn_show_spec);

    // fchr is correct here:
    int fchr = c.getInt(c.getColumnIndex(
                 WaveDataContentProvider.SiteForecast.FORECAST_PERIOD));

    Log.d(TAG, "ChrisB: bindView: FCHR is: " + fchr );

    b.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(getActivity(), SpecDrawActivity.class);
            i.setAction(Intent.ACTION_VIEW);
            i.putExtra("com.kernowsoft.specdraw.SITENAME", mSitename);

            // fchr is NOT CORRECT here! I can't use the fchr from the
            // bindView method as Lint tells me this is an error:
            int fchr = c.getInt(c.getColumnIndex(
                 WaveDataContentProvider.SiteForecast.FORECAST_PERIOD));

            Log.d(TAG, "bindView: Forecast hour is: " + fchr);
            i.putExtra("com.kernowsoft.specdraw.FCHR", fchr);
            getActivity().startActivity(i);
        }
    });
}

上記のコードのコメントからわかるようfchrに、ログインに出力すると正しいですが、メソッドbindViewでは正しくありません。メソッドから変数をonClick参照しようとしましたが、Andriod Lint はこれを行うことができないと言います:fchrbindViewonClick

別のメソッドで定義された内部クラス内の非最終変数 fchr を参照できません

fchr私の質問は次のとおりです。変数をカーソルからonClickメソッドに正しく渡すにはどうすればよいですか?

ありがとう!

4

2 に答える 2

3

エラーの理由は、変数fchrが bindView() メソッドのローカル変数であることです。匿名クラスで作成したオブジェクトは、bindView() メソッドが返されるまで続く場合があります。

bindView() メソッドが戻ると、ローカル変数はスタックからクリーンアップされるため、bindView() が戻った後は存在しなくなります。

しかし、匿名クラス オブジェクトは変数を参照しますfchr。クリーンアップされた後に匿名クラス オブジェクトが変数にアクセスしようとすると、事態はひどく悪化します。

final にすることfchrで、実際には変数ではなく、定数になります。コンパイラはfchr、匿名クラスでの使用を定数の値に置き換えるだけで、存在しない変数へのアクセスに問題はなくなります。

内部クラスの操作を参照してください

于 2013-04-20T09:01:06.097 に答える