0

我创建了一个自定义的 SimpleCursorAdapter,我已经在其中覆盖了它,bindView因此我可以onClick在列表项布局中连接 ImageButton 的侦听器。我想在单击按钮时使用Intent来自底层的一些额外数据集来启动一个新应用程序Cursor启动一个新应用程序。

问题是当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方法中却不正确。我尝试从方法中引用fchr变量,但 Andriod Lint 告诉我我不能这样做:bindViewonClick

不能在不同方法中定义的内部类中引用非最终变量 fchr

我的问题是:如何正确地将fchr变量从光标传递到onClick方法中?

谢谢!

4

2 回答 2

3

错误的原因是变量fchr是 bindView() 方法中的局部变量。您使用匿名类创建的对象可能会持续到 bindView() 方法返回之后。

当 bindView() 方法返回时,局部变量将从堆栈中清除,因此在 bindView() 返回后它们将不再存在。

但是匿名类对象引用了变量fchr。如果匿名类对象在清理变量后试图访问它,事情就会变得非常糟糕。

通过使fchrfinal,它们不再是真正的变量,而是常量。然后,编译器只需将fchr匿名类中的使用替换为常量的值,您就不会再遇到访问不存在的变量的问题了。

请参阅使用内部类

于 2013-04-20T09:01:06.097 回答
0

代替:

b.setOnClickListener(new OnClickListener() {

利用:

b.setOnClickListener(new MyClickListener(fchr));

MyClickListener 类看起来像:

class MyClickListener implements OnClickListener {
    int mFchr;
    public MyClickListener(int fchr) {
        mFchr = fchr;
    }
    @Override
    public void onClick(View v) {
        // here you can access mFchr
    }
}
于 2013-04-20T09:19:52.350 回答