У меня есть этот макет для элемента списка:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/backgroundTela">
<TextView
android:id="@+id/tvwLvItem"
android:layout_width="0sp"
android:layout_height="50sp"
android:layout_weight="8"
android:layout_gravity="center"
android:text="Texto"
style="@style/lvwTexto">
</TextView>
<RadioButton
android:id="@+id/rdbDefault"
android:layout_width="0sp"
android:layout_height="wrap_content"
android:layout_weight="1.2"/>
</LinearLayout>
И я хочу, чтобы мой пользователь выбрал только один элемент, как это контролировать? Например, он выбирает второй предмет, тогда все остальные предметы остаются невыбранными, а когда он выбирает другой предмет, все остальные предметы остаются невыбранными.
РЕШЕНИЕ:
Используйте этот класс в макете элемента ListView:
public class CheckableLinearLayout extends LinearLayout implements Checkable {
private CheckedTextView _checkbox;
public CheckableLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
// find checked text view
int childCount = getChildCount();
for (int i = 0; i < childCount; ++i) {
View v = getChildAt(i);
if (v instanceof CheckedTextView) {
_checkbox = (CheckedTextView) v;
}
}
}
@Override
public boolean isChecked() {
return _checkbox != null ? _checkbox.isChecked() : false;
}
@Override
public void setChecked(boolean checked) {
if (_checkbox != null) {
_checkbox.setChecked(checked);
}
}
@Override
public void toggle() {
if (_checkbox != null) {
_checkbox.toggle();
}
}
}
Теперь вам нужно только CheckedTextView в элементе макета:
<com.developer_lib.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="@dimen/dimDefaultButtonMeasures"
android:background="@drawable/list_item_background"
android:orientation="horizontal" >
<ImageView
android:contentDescription="@string/cd_contato_foto"
android:id="@+id/imvFoto"
android:layout_width="@dimen/dimDefaultButtonMeasures"
android:layout_height="@dimen/dimDefaultButtonMeasures"
android:layout_gravity="center" />
<CheckedTextView
android:id="@+id/chlSelecao"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="2"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:ellipsize="marquee"
android:gravity="center_vertical"
android:padding="4dp"
android:singleLine="true" />
В конечном итоге ваш Listview будет управлять режимом выбора, например:
<ListView
android:id="@+id/lvwHorarios"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:choiceMode="singleChoice" />