Android 对于以编程方式添加的按钮,单击时会出现不同的错误

Android 对于以编程方式添加的按钮,单击时会出现不同的错误,android,database,button,onclick,onclicklistener,Android,Database,Button,Onclick,Onclicklistener,我浏览了一些主题,但找不到确切的答案,或者至少找不到正确的答案。代码中的情况是,我为数据库中的每一行创建了一个按钮,每个按钮都应该有一个OnClick,它将我们发送到另一个活动以及一些值(每个按钮应该有不同的值)但最后,似乎我所有的按钮都得到了相同的值,这让我觉得它只为所有按钮创建了一个视图 Cursor przepis = bazaUzytkownikow.rawQuery("SELECT * FROM przepisy", null); int liczba_wierszy = pr

我浏览了一些主题,但找不到确切的答案,或者至少找不到正确的答案。代码中的情况是,我为数据库中的每一行创建了一个按钮,每个按钮都应该有一个OnClick,它将我们发送到另一个活动以及一些值(每个按钮应该有不同的值)但最后,似乎我所有的按钮都得到了相同的值,这让我觉得它只为所有按钮创建了一个视图

Cursor przepis = bazaUzytkownikow.rawQuery("SELECT * FROM przepisy", null);
    int liczba_wierszy = przepis.getCount();
    przepis.moveToPosition(0);

    for (int i = 0; i < (liczba_wierszy/4)+1; i++) {
        LinearLayout row = new LinearLayout(this);
        row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        for (int j = 0; j < 4; j++) {


            if((przepis.moveToPosition((i*4)+j)!=false))
            {
                nrPrzepisu=(i*4)+j;
            Button btnTag = new Button(this);
            btnTag.setLayoutParams(new LayoutParams(115, 60));
            btnTag.setText(przepis.getString(przepis.getColumnIndex("nazwa")));
            btnTag.setTextSize(10);
            btnTag.setId(j + 1 + (i * 4));


            btnTag.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View t) {
                    // TODO Auto-generated method stub
                    Intent IdzPrzepis = new Intent(getApplicationContext(), DodajPrzepis.class);
                    IdzPrzepis.putExtra("ID_uzytkownika", ID_uzytkownika);
                    IdzPrzepis.putExtra("nr_Przepisu", nrPrzepisu);
                    startActivity(IdzPrzepis);
                }
            });
            row.addView(btnTag);
            }
        }

       layout.addView(row);
    }
Cursor przepis=bazaUzytkownikow.rawQuery(“SELECT*FROM przepis”,null);
int liczba_wierszy=przepis.getCount();
przepis.moveToPosition(0);
对于(int i=0;i<(liczba_wierszy/4)+1;i++){
LinearLayout行=新的LinearLayout(该行);
row.setLayoutParams(新的LayoutParams(LayoutParams.FILL\u父级,LayoutParams.WRAP\u内容));
对于(int j=0;j<4;j++){
if((przepis.moveToPosition((i*4)+j)!=false))
{
nrPrzepisu=(i*4)+j;
按钮btnTag=新按钮(此按钮);
btnTag.setLayoutParams(新的LayoutParams(115,60));
btnTag.setText(przepis.getString(przepis.getColumnIndex(“nazwa”));
btnTag.setTextSize(10);
btnTag.setId(j+1+(i*4));
btnTag.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图t){
//TODO自动生成的方法存根
Intent IdzPrzepis=新Intent(getApplicationContext(),DodajPrzepis.class);
IdzPrzepis.putExtra(“ID_uzytkownika”,ID_uzytkownika);
IdzPrzepis.putExtra(“nr_Przepisu”,nrPrzepisu);
星触觉(IdzPrzepis);
}
});
行。添加视图(btnTag);
}
}
布局。添加视图(行);
}
为了让代码更清晰,bazaUzytkownikow是我的数据库,liczba_wierszy是我得到的行数。我将光标移到开始处,因为它是我想要开始的地方,我继续使用2个循环“剪切”我的数据。我的目标是在一排4个按钮。 我认为不起作用的部分是OnClick方法,我希望我的按钮切换活动并发送nrPrzepisu,这基本上是在我的按钮和数据库中正确的行之间添加连接(在另一个活动中,我想设置文本,从数据库中读取行取决于单击哪个按钮)。
我检查了另一个活动,它似乎每次都在读取相同的nrPrzepisu,这通常等于循环结束时nrPrzepisu=(I*4)+j的最后一个值,这让我觉得我需要为每个按钮创建不同的视图。

您将相同的对象传递给每个onClick,然后在下一次迭代中更改该对象。最后,所有onclick都有相同的nrPzepisu对象,它返回的值是本例中最后一个值

int nrPrzepisu = (i*4) + j;

这样,您就不会将同一个对象传递到所有onclick中。

我是这方面的新手,但在这之后我添加了一个“final int transfer=nrPrzepisu”。我可以复制到我的意图以及它的工作,谢谢!