2012-02-21 23 views
0

私のアクティビティでは、SQLiteデータベース(_id、name、number)を調べて、データベースに行を持つボタンを追加します。各ボタンについて、私は対応するデータベース行からデータを渡す必要がある別のアクティビティを開始するonClickListenerを動的に作成します。私のコードは次のとおりです。Android:動的にボタンにOnClickListenersを追加

Bundle extras = getIntent().getExtras(); 
name = extras.getString("name_bundle"); 
number = extras.getString("number_bundle"); 

すべてのボタンが正しく作成されますが、私の問題は、すべてのことです。私はこのようなデータに渡さと協力のImageButtonによって開始された新しい活動に

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(); 

をそれらは同じ情報を渡す。私の意図は、3番目のボタンをクリックすると、データベースの3番目の行のデータ(コードの1番目と2番目の列)が渡されたことです(新規に開始されたアクティビティでは、それらをTextViewで表示します)。しかし、何が起こるかは、すべてのボタンが同じデータを渡すことです!データベースの最後の行からのデータを正確にします。もう1つの行をデータベースに追加しようとすると、1つの余分なボタンが作成され、それらのすべてが新しく作成された(したがって最後の)行から同じデータを再度表示しました。私は自分のコードに間違いがあるとか、完全に悪いと思っています。何か案は?ありがとう!!新しいアクティビティの使用において

+1

onClickListener実装の前にインテントを作成してから、 'button.setTag(intent);を使用してください(すべてのボタンのOnClickListener実装) (ビューv){ startActivity((インテント)v.getTag()); } 'ボタンに設定しますbutton.setOnClickListener(listener);' – Selvin

+0

とにかく...リストビューを再呼び出ししています – Selvin

+0

... 'name'と' number'宣言を入れてみることもできます** IN ** for 'ループスコープ(スコープでは「{}」または「expireion」を意味します) – Selvin

答えて

-1

removeExtra()

Bundle extras = getIntent().getExtras(); 
name = extras.getString("name_bundle"); 
number = extras.getString("number_bundle"); 
getIntent().removeExtra("name_bundle"); 
getIntent().removeExtra("number_bundle"); 

アクティビティ古いエキストラを開始し、新たなに置き換えないです。

+0

私はこれらの2行を追加しましたが、問題は解決しませんでした。それでも私は最後の行からのデータだけを取得します。しかし、奇妙なことは、古いエキストラが置き換えられないとき、なぜ私は最後の行のデータだけを見るのですか?最初のボタンが最初にリスナーに割り当てられて以来、最初の行のデータだけが表示されるはずです。 –

+0

heh ...あなたは両方とも、匿名のインターフェイス実装でローカル変数について読むべきです。 'String name; 文字列の番号; 'はローカルです...そして、最後の"カーソル行 "の反復の後にいくつかの値があります...次に、この(最後の)値はOnClickListenerのすべての匿名インタフェースの実装で使用されます – Selvin

+0

ええ、私はそれを見ると思います。リスナーメソッドは、ボタンがクリックされたときにのみ呼び出されるので、私が与えた変数を使用しますが、それらはすでに最後のデータベース行の値に設定されています。このループの値を変更するのは無意味です...これを解決する方法はありますか? –

関連する問題