如何使用单选择自定义listview项目

时间:2011-12-08 05:51:47

标签: android listview radio-button

我有listview项目的这个布局:

<?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你的Listview将控制选择模式,例如:

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

2 个答案:

答案 0 :(得分:0)

您可以通过以下想法获得解决方案

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

您必须为CustomListView.Hope编写自定义适配器,这对您有用

答案 1 :(得分:0)

它为我工作

第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();

            }
        });