【发布时间】:2012-02-21 19:15:29
【问题描述】:
在我的活动中,我查看了一个 SQLite 数据库(_id、名称、编号)并添加了与数据库中的行一样多的按钮。对于每个按钮,我动态创建 onClickListener,它将启动另一个活动,我需要将来自对应数据库行的数据传递到该活动中。我的代码如下:
db.open();
String name;
String number;
Cursor c = db.getAllContacts();
c.moveToFirst();
int count = db.getCount();
for (int i = 0; i < count; i++) {
ImageButton button = new ImageButton(this);
name = c.getString(1);
number = c.getString(2);
button.setOnClickListener(new onClickListener() {
public void onClick(View v) {
Intent intent = new Intent(This_class.this, Other_class.class);
intent.putExtra("name_bundle", name);
intent.putExtra("number_bundle", number);
startActivity(intent);
}
});
c.moveToNext();
}
db.close();
在由 ImageButton 启动的新 Activity 中,我处理传递的数据,如下所示:
Bundle extras = getIntent().getExtras();
name = extras.getString("name_bundle");
number = extras.getString("number_bundle");
所有按钮都正确创建,但我的问题是它们都传递相同的信息。我的意图是,当单击第三个按钮时,将传递来自数据库第三行的数据(代码中的第 1 列和第 2 列)(在新启动的 Activity 中,我将它们显示在 TextView 中)。但是发生的情况是所有按钮都传递相同的数据!准确地说,来自数据库最后一行的数据。当我尝试向数据库添加另一行时,创建了一个额外的按钮,并且所有按钮再次显示来自数据库新创建的(因此是最后一个)行的相同数据。我怀疑我的代码中存在错误或完全错误的方法。有任何想法吗?谢谢!!
【问题讨论】:
-
在 onClickListener 实现之前创建意图,然后使用
button.setTag(intent);为所有按钮制作 ONE(fx.: as class field) OnClickListener 实现:static final OnClickListener listener = new OnClickListener() { public void onClick(View v) { startActivity((Intent)v.getTag()); }然后将其设置为按钮button.setOnClickListener(listener); -
无论如何......你正在重新投资 ListView
-
...您也可以尝试将
name和number声明INfor循环范围(范围我的意思是“{}”或拳头表达式) 并在那里使 em final ... -
我不太明白这段代码的作用,但它完全有效:) 我使用了你发布的第一种方法,这真的很有帮助,谢谢!!!! :)
-
提示:View v 是被点击的按钮,因为 Button 是 View 的子类 ... 只需将意图作为视图的标签并在 onClick 中恢复 ....
标签: android android-intent bundle