gpt4 book ai didi

java - 自定义 SimpleCursorAdapter - onClickListener 的重载 bindView 问题

转载 作者:行者123 更新时间:2023-12-01 23:52:46 26 4
gpt4 key购买 nike

我创建了一个自定义 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);
}
});
}

从上面代码中的注释可以看出,fchrbindView中打印到日志时是正确的,但在中却是错误的onClick 方法。我尝试从 onClick 方法引用 bindView 中的 fchr 变量,但 Andriod Lint 告诉我我不能这样做:

Cannot refer to a non-final variable fchr inside an inner class defined in a different method

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

谢谢!

最佳答案

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

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

但是匿名类对象引用了变量fchr。如果匿名类对象在清理变量后尝试访问变量,事情会变得非常错误。

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

参见Working with inner classes

关于java - 自定义 SimpleCursorAdapter - onClickListener 的重载 bindView 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16118499/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com