为每个循环动态创建的视图设置 ID - android
Set Id for views dynamically created by a for each loop - android
我通过使用 for..each 循环遍历 ArrayList 动态地向 TableLayout 添加未知数量的视图。
当我尝试为每个视图设置唯一 ID 时,每个视图最终都具有相同的 ID。
TableLayout Table = findViewById(R.id.table);
idCounter = 0;
for (String string: array) {
TableRow row = new TableRow(this);
// adds id to table
TextView serialText = new TextView(this);
serialText.setText(string);
row.addView(serialText);
serialText.setId(idCounter);
idCounter ++;
// first checkbox
CheckBox firstCheckbox= new CheckBox(this);
row.addView(firstcheckbox);
firstcheckbox.setId(idCounter);
idCounter ++;
firstCheckBox.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
onCheckBoxClick(idCounter);
}
});
// second checkbox
CheckBox secondCheckbox= new CheckBox(this);
row.addView(secondCheckbox);
secondCheckbox.setId(idCounter);
idCounter ++;
secondCheckBox.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
onCheckBoxClick(idCounter);
}
});
// third checkbox
CheckBox thirdCheckbox= new CheckBox(this);
row.addView(thirdCheckbox);
thirdCheckbox.setId(idCounter);
idCounter ++;
thirdCheckBox.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
onCheckBoxClick(idCounter);
}
});
// add row to table
Table.addView(row, new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT));
}
我需要每个视图都有一个唯一的 ID,这样我就可以在使用 OnClickListener 时区分视图。
public void onCheckBoxClick(Integer id) {
Log.d("ID", id);
}
每个复选框都有相同的 ID,它总是最后设置的。
首先 View.generateViewId()(API 级别 > 17)将为您的视图创建一个唯一 ID。
然后使用setId()设置生成的id。
Other solution
,您可以在 class 扩展应用程序 class 中创建 1 个静态变量,并增加它。
示例:在 YourApplication 中扩展应用程序:
public class YourApplication extends Application {
public static int newId = 1;
}
当需要新的id时,只需增加newId即可。
我通过使用 for..each 循环遍历 ArrayList 动态地向 TableLayout 添加未知数量的视图。
当我尝试为每个视图设置唯一 ID 时,每个视图最终都具有相同的 ID。
TableLayout Table = findViewById(R.id.table);
idCounter = 0;
for (String string: array) {
TableRow row = new TableRow(this);
// adds id to table
TextView serialText = new TextView(this);
serialText.setText(string);
row.addView(serialText);
serialText.setId(idCounter);
idCounter ++;
// first checkbox
CheckBox firstCheckbox= new CheckBox(this);
row.addView(firstcheckbox);
firstcheckbox.setId(idCounter);
idCounter ++;
firstCheckBox.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
onCheckBoxClick(idCounter);
}
});
// second checkbox
CheckBox secondCheckbox= new CheckBox(this);
row.addView(secondCheckbox);
secondCheckbox.setId(idCounter);
idCounter ++;
secondCheckBox.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
onCheckBoxClick(idCounter);
}
});
// third checkbox
CheckBox thirdCheckbox= new CheckBox(this);
row.addView(thirdCheckbox);
thirdCheckbox.setId(idCounter);
idCounter ++;
thirdCheckBox.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
onCheckBoxClick(idCounter);
}
});
// add row to table
Table.addView(row, new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT));
}
我需要每个视图都有一个唯一的 ID,这样我就可以在使用 OnClickListener 时区分视图。
public void onCheckBoxClick(Integer id) {
Log.d("ID", id);
}
每个复选框都有相同的 ID,它总是最后设置的。
首先 View.generateViewId()(API 级别 > 17)将为您的视图创建一个唯一 ID。
然后使用setId()设置生成的id。
Other solution
,您可以在 class 扩展应用程序 class 中创建 1 个静态变量,并增加它。
示例:在 YourApplication 中扩展应用程序:
public class YourApplication extends Application {
public static int newId = 1;
}
当需要新的id时,只需增加newId即可。