我创建了一个自定义的SimpleCursorAdapter,其中我已覆盖bindView
,因此我可以在列表项布局中连接ImageButton的onClick
侦听器。我想在使用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
方法引用bindView
中的onClick
变量,但Andriod Lint告诉我,我无法做到这一点:
不能引用在不同方法中定义的内部类中的非最终变量fchr
我的问题是:如何正确地将fchr
变量从光标传递到onClick
方法?
谢谢!
答案 0 :(得分:3)
错误的原因是变量fchr
是bindView()方法中的局部变量。使用匿名类创建的对象可能会持续到bindView()方法返回之后。
当bindView()方法返回时,局部变量将从堆栈中清除,因此在bindView()返回后它们不再存在。
但匿名类对象引用变量fchr
。如果匿名类对象在清理完变量后尝试访问变量,那将会出现严重错误。
通过使fchr
最终,它们不再是变量,而是常量。然后,编译器可以将匿名类中fchr
的使用替换为常量的值,并且不再存在访问不存在的变量的问题。
答案 1 :(得分: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
}
}