Привет, ребята, у меня есть список, который использует настраиваемый макет строки. Макет состоит из 2 меток, изображения и флажка.
Я пытаюсь запустить слушателя, когда флажок установлен. Слушатель я написал работы, но вместо того, чтобы стрелять для отдельной строки, он запускается для каждой отдельной строки в списке. Как если бы я установил флажок в своей первой строке, диалог откроется и будет работать правильно, однако 2, 3 и 4 строки также будут "стрелять".
Здесь соответствующая область моего кода:
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row, null);
}
final item o = items.get(position);
if (o != null) {
TextView tt = (TextView) v.findViewById(R.id.name);
TextView bt = (TextView) v.findViewById(R.id.game);
CheckBox cb = (CheckBox) v.findViewById(R.id.caught);
if (cb != null && o.getStatus()) {
cb.setChecked(true);
} else {
cb.setChecked(false);
}
if (tt != null) {
tt.setText(o.getName());
}
if (bt != null && o.getStatus()) {
bt.setText("Game: " + o.getGame());
}
cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
o.setStatus(isChecked);
if (isChecked) {
AlertDialog.Builder builder2 = new AlertDialog.Builder(
context);
builder2.setTitle("What game are we talkin gabout?");
builder2.setItems(Checklist.GAMES,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int item) {
Toast.makeText(context,
Checklist.GAMES[item],
Toast.LENGTH_SHORT).show();
o.setGame(Checklist.GAMES[item]);
o.setStatus(true);
me.notifyDataSetChanged();
}
});
builder2.show();
} else {
o.setGame("");
o.setStatus(false);
me.notifyDataSetChanged();
}
}
});
}
return v;
}
Есть ли более подходящее место для создания моего слушателя для флажка?
Я думаю, что это не хорошее решение, чтобы осваивать новый OnCheckedChangeListener каждый раз, когда представление обновляется со значениями. Было бы лучше установить слушателя только один раз для просмотра в точке, где это новое представление получает раздувание. Вы можете сделать o-Object доступным для слушателя, поместив его в тег cb (setTag (..)). Обратите внимание, что событие onCheckedChanged также срабатывает, когда вы устанавливаете состояние CB с помощью cb.setChecked().
например:
CheckBox cb = null;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row, null);
cb = (CheckBox) v.findViewById(R.id.caught);
// set a listener
cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
item o = (item) buttonView.getTag();
// show your dialog
}
});
}
item o = items.get(position);
if (o != null) {
TextView tt = (TextView) v.findViewById(R.id.name);
TextView bt = (TextView) v.findViewById(R.id.game);
cb = (CheckBox) v.findViewById(R.id.caught);
cb.setTag(o);
// set checked state & text
// ...
}