使用循环生成TextViews并为每个启用单击

时间:2013-01-19 15:49:38

标签: android onclick onclicklistener

我正在制作一个Android应用程序,在我的活动之后,我执行对数据库的查询,然后我取结果。我获取结果并将TextViews设置为Activity。我想当我点击TextView时,将我点击的餐馆名称传递给下一个活动。我的代码的问题是,对于所有TextViews,它保存了最后一个餐厅的名称。有任何想法吗?谢谢!

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

}

2 个答案:

答案 0 :(得分:0)

您需要在循环中设置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());
}

答案 1 :(得分:0)

尝试进行这些更改

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

设置为最后一个餐馆名称的原因是因为字符串是通过引用而不是值传递的,因为它是一个对象。在do while循环的范围内创建一个唯一的字符串应该可以解决这个问题。