0

私は Android アプリを作成しています。次のアクティビティで、データベースに対してクエリを実行し、結果を取得します。結果を取得し、Activity に TextView を作成します。TextView をクリックしたときに、クリックしたレストランの名前を次のアクティビティに渡す必要があります。私のコードの問題は、すべての TextView で最後のレストランの名前が保存されることです。何か案は?ありがとうございました!

public class ViewRestaurants extends Activity{
String name;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.row_restaurant);

DBAdapter db = new DBAdapter(this);
db.open();

Cursor c = db.getSpRestaurants(getIntent().getStringExtra("city"), getIntent().getStringExtra("area"), getIntent().getStringExtra("cuisine"));

View layout =  findViewById(R.id.items);

if(c.moveToFirst())
{
    do{
        name = c.getString(0);
        TextView resname = new TextView(this);
        TextView res = new TextView(this);
        View line = new View(this);

        resname.setText(c.getString(0));
        resname.setTextColor(Color.RED);
        resname.setTextSize(30);
        resname.setTypeface(null,Typeface.BOLD);

        res.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
        res.setText(c.getString(1)+","+c.getString(2)+","+c.getString(3)+"\n"+c.getString(4));
        res.setTextSize(20);
        res.setTextColor(Color.WHITE);
        res.setClickable(true);
        res.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                i.setClassName("com.mdl.cyrestaurants.guide", "com.mdl.cyrestaurants.guide.RestaurantDetails");
                i.putExtra("name",name);
                startActivity(i);
            }
        });

        line.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,2));
        line.setBackgroundColor(Color.RED);

        ((LinearLayout) layout).addView(resname);
        ((LinearLayout) layout).addView(res);
        ((LinearLayout) layout).addView(line);
    }while (c.moveToNext());

}

    db.close();
}

}

4

2 に答える 2

0

これらの変更を行ってみてください

String name = c.getString(0);
resname.setText(name);

最後のレストラン名に設定している理由は、文字列がオブジェクトであるため、値ではなく参照によって渡されるためです。do while ループの範囲内で一意の文字列を作成すると、これを解決できます。

于 2013-01-19T16:06:32.840 に答える
0

ループ内で finalを作成し、nameそれをクラス フィールドとして削除して、そのまま使用するOnClickListener必要があります。

if(c.moveToFirst())
{
    do{
        final String name = c.getString(0);

        //other code ...

        res.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                i.setClassName("com.mdl.cyrestaurants.guide", "com.mdl.cyrestaurants.guide.RestaurantDetails");
                i.putExtra("name",name);
                startActivity(i);
            }
        });

        //more code...

    }while (c.moveToNext());
}
于 2013-01-19T15:59:04.473 に答える