Ответ 1
Рекомендуемое решение здесь - полагаться на встроенную поддержку выбора ListView, определяющую для него режим выбора:
list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
Затем вы должны позволить вашему элементу списка реализовать интерфейс Checkable; что требует некоторой настройки корневого представления вашего макета. Предполагая, что он имеет LinearLayout в качестве корня, реализация может выглядеть так:
public class MyListItem extends LinearLayout implements Checkable {
public MyListItem(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyListItem(Context context) {
super(context);
}
private boolean checked = false;
private ImageView icon;
@Override
protected void onFinishInflate() {
super.onFinishInflate();
icon = (ImageView)findViewById(R.id.img); // optimisation - you don't need to search for image view every time you want to reference it
}
@Override
public boolean isChecked() {
return checked;
}
@Override
public void setChecked(boolean checked) {
this.checked = checked;
if (icon.getVisibility() == View.VISIBLE) {
icon.setImageResource((checked) ? R.drawable.checked : R.drawable.unchecked);
}
}
@Override
public void toggle() {
setChecked(!checked);
}
}
Ваш файл макета должен быть обновлен для ссылки на класс MyListItem вместо LinearLayout, конечно.
Это может быть несколько сложным подходом, но он имеет преимущества, такие как автоматическое восстановление проверяемого элемента при восстановлении активности.
Другой вариант - снова использовать режим выбора списка и переопределить getView адаптера, чтобы узнать, проверен ли элемент и соответственно обновить изображение:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ListView list = getListView();
list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
list.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item,
R.id.title, text) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
ImageView icon = (ImageView) v.findViewById(R.id.img);
if (list.isItemChecked(position)) {
icon.setImageResource(R.drawable.checked);
} else {
icon.setImageResource(R.drawable.unchecked);
}
return v;
}
});
}
Однако эта версия имеет некоторые проблемы с производительностью - findViewById и setImageResource - относительно трудоемкие операции, поэтому вам следует рассмотреть возможность использования некоторого кэширования. Я рекомендую посмотреть "Мир ListView" , чтобы узнать некоторые полезные советы об этом виджетах.
Последний подход также связывает адаптер с списком, который вводит ненужную связь.