Как создать пользовательский элемент списка с радиокнопкой и одним выбором

У меня есть этот макет для элемента списка:

<?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" />

Finnaly your Listview will control the choice mode, for example:

<ListView
android:id="@+id/lvwHorarios"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:choiceMode="singleChoice" />

person weldsonandrade    schedule 08.12.2011    source источник
comment
Вы нашли какое-нибудь решение? Вы можете поделиться этим? Спасибо.   -  person user430926    schedule 01.02.2012
comment
поделитесь своим решением, пожалуйста ..   -  person Code_Life    schedule 03.01.2013


Ответы (2)


это сработало для меня

Шаг 1:

в файле пользовательского адаптера просто объявите это

int selectedIndex = -1;

Шаг 2. Пользовательский макет с одной строкой

   <RadioButton
    android:id="@+id/radio_list"
    android:checked="false"
    android:focusable="false"
    android:clickable="false" />

Шаг 3:

  <ListView
            android:id="@+id/liststorecard"
            android:layout_width="match_parent"
            android:layout_height="150dp"
            **android:descendantFocusability="beforeDescendants"
            android:choiceMode="singleChoice"**
            android:layout_weight="1"
          />

Шаг 4: Создайте интерфейс в настраиваемом адаптере

 public void setSelectedIndex(int index)
   {
        selectedIndex = index;
    }

Шаг 5. В методе getview напишите код

  if(selectedIndex == position)
   {
    holder.rblist.setChecked(true);
   }
  else
   {
    holder.rblist.setChecked(false);
   }

Шаг 6: последний шаг установите выбранный индекс для интерфейса

liststorecard.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {


                storeCardAdapter.setSelectedIndex(position);
                storeCardAdapter.notifyDataSetChanged();

            }
        });
person Chandresh Patel    schedule 31.10.2015

вы можете получить свое решение, следуя идее

http://www.androidpeople.com/android-custom-listview-tutorial-part-1

вам необходимо написать свой собственный адаптер для CustomListView. Надеюсь, это сработает для вас. Наслаждайтесь

person Last Warrior    schedule 08.12.2011