У меня есть ArrayAdapter для представления списка, в котором есть несколько кнопок. Для одной кнопки переключения я хочу иметь состояние по умолчанию, основанное на условии, и позволить пользователям также переключать кнопку.OnClickListener в ArrayAdapter предпринимает действия в неправильных строках
Однако, когда пользователи нажимают кнопку в строке 1, кнопка для строки 3 фактически выбирается. Я не знаю, почему это происходит. Ниже приведен фрагмент соответствующего кода из моего метода getView
с комментариями.
расположение моего тумблера
<ToggleButton android:id="@+id/color_toggle"
android:layout_width="50px"
android:layout_height="50px"
android:focusable="false"
android:textOn="" android:textOff="" android:layout_alignParentLeft="true"
android:layout_marginRight="10dp"
/>
class Color {
int id;
int something;
}
List<Color> colorsList;
class ColorHolder {
TextView colorNameText;
ToggleButton toggleButton;
}
public View getView(final int position, final View convertView, final ViewGroup parent) {
View rowView = convertView;
Color c = colorsList.get(position);
if (null == rowView) {
rowView = this.inflater.inflate(R.layout.list_item_color, parent, false);
holder = new ColorHolder();
holder.colorNameText = (TextView) rowView.findViewById(R.id.color_name);
holder.toggleButton = (ToggleButton) rowView.findViewById(R.id.color_toggle);
rowView.setTag(holder);
}
else {
holder = (ColorHolder)rowView.getTag();
}
holder.toggleButton.setTag(c.getId());
final ColorHolder thisRowHolder = holder;
holder.toggleButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (thisRowHolder.toggleButton.isChecked()) {
thisRowHolder.toggleButton.setBackgroundDrawable(//normal button);
thisRowHolder.toggleButton.setChecked(false);
for (int i = 0; i < colorList.size(); i++) {
if (colorList.get(i) == (Integer)v.getTag()) {
colorList.get(i).setSomething(0);
break;
}
}
adapter.notifyDataSetChanged();
}
else {
thisRowHolder.toggleButton.setBackgroundDrawable(//enabled button);
thisRowHolder.toggleButton.setChecked(true);
for (int i = 0; i < colorList.size(); i++) {
if (colorList.get(i) == (Integer)v.getTag()) {
colorList.get(i).setSomething(1);
break;
}
}
adapter.notifyDataSetChanged();
}
}
});
if (c.getSomething()>0) {
holder.toggleButton.setBackgroundDrawable(//enabled button);
holder.toggleButton.setChecked(true);
}
else {
holder.toggleButton.setBackgroundDrawable(//normal button);
holder.toggleButton.setChecked(false);
}
return rowView;
}
Вопрос
Что я делаю неправильно? почему другие кнопки в третьей строке переключаются, хотя я переключаю кнопки в первой строке.
Я читал, что это происходит потому, что listView перерабатывает, нет ли способа исправить это? Некоторые стратегии, которые я пробовал, безрезультатно, основывались на похожих вопросах: 1) положил onClickListener
в статью if
. 2) вместо установки int
в setTag
вместо установки holder
и использовать его в holder
onClickListener
обновление
Я обновил весь код в вопросе с предложениями, которые я получил.
это происходит bcoz ListView перерабатывает взгляды – Raghunandan
Я читал, что ... не существует никакого способа почини это? – Anthony
проверьте это, если это поможет http://stackoverflow.com/questions/20611123/listview-subobject-clickable-confilct/20612237#20612237 – Raghunandan