带有 RadioButton 单选的自定义 ListView

Posted

技术标签:

【中文标题】带有 RadioButton 单选的自定义 ListView【英文标题】:Custom ListView with RadioButton single choice 【发布时间】:2014-05-03 01:05:37 【问题描述】:

我希望你们中的一些人可以帮助我:

我有一个自定义列表视图 2 个文本视图和 1 个单选按钮。

我想把它作为一个单一的选择,但每次我 单击列表视图上的项目,它不会删除 从另一个单选按钮“检查”。

我的xml代码:

<LinearLayout
    android:layout_
    android:layout_ >

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical" >

        <TextView
            android:id="@+id/tvMaterialName"
            android:layout_
            android:layout_
            android:padding="5dp"
            android:text="MaterialName"
            android:textSize="35px" />

        <TextView
            android:id="@+id/tvMaterialNo"
            android:layout_
            android:layout_
            android:padding="5dp"
            android:text="MaterialNo"
            android:textSize="1px"
            android:visibility="invisible" />
    </LinearLayout>

    <RadioButton
        android:id="@+id/rdBtn"
        android:layout_
        android:layout_
        android:focusable="false"
        android:checked="false" />
</LinearLayout

还有我的 onItemClickListener:

searchList.setOnItemClickListener(new OnItemClickListener() 

        @Override
        public void onItemClick(AdapterView<?> parent, View v,
                int position, long id) 

            LinearLayout item_view = (LinearLayout) v;
            RadioButton itemcheck = (RadioButton) item_view
                    .findViewById(R.id.rdBtn);

            itemcheck.setChecked(true);
            if (itemcheck.isChecked()) 
                itemcheck.setChecked(true);
             else 
                itemcheck.setChecked(false);
            
           

    );

我的适配器中的 getView()

@Override
public View getView(final int position, View convertView, ViewGroup parent) 
    final ViewHolder viewHolder;
    final Materials materialItem = getItem(position);
    parent.setClickable(true);

    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) 

        convertView = inflater.inflate(R.layout.d, null, false);
        viewHolder = new ViewHolder();
        viewHolder.tvMaterialName = (TextView) convertView
                .findViewById(R.id.tvMaterialName);
        viewHolder.tvMaterialNo = (TextView) convertView
                .findViewById(R.id.tvMaterialNo);

        convertView.setTag(viewHolder);

     else 
        viewHolder = (ViewHolder) convertView.getTag();

    

    viewHolder.tvMaterialName.setText(materialItem.getMaterialName());
    viewHolder.tvMaterialNo.setText(materialItem.getMaterialNo());

    return convertView;

感谢您的帮助

【问题讨论】:

CustomAdaptergetView()的邮政编码。 你的列表类型是什么,我的意思是列表中的项目。 我现在已经从我的适配器发布了我的 getView :) 【参考方案1】:

试试这样:

public class CheckedLinearLayout extends RelativeLayout implements
    Checkable 

private boolean isChecked;
private List<Checkable> checkableViews;

public CheckedLinearLayout (Context context, AttributeSet attrs,
        int defStyle) 
    super(context, attrs, defStyle);
    initialise(attrs);


public CheckedLinearLayout (Context context, AttributeSet attrs) 
    super(context, attrs);
    initialise(attrs);


public CheckedLinearLayout (Context context, int checkableId) 
    super(context);
    initialise(null);


public boolean isChecked() 
    return isChecked;


public void setChecked(boolean isChecked) 
    this.isChecked = isChecked;
    for (Checkable c : checkableViews) 
        c.setChecked(isChecked);
    

public void toggle() 
    this.isChecked = !this.isChecked;
    for (Checkable c : checkableViews) 
        c.toggle();
    


@Override
protected void onFinishInflate() 
    super.onFinishInflate();

    final int childCount = this.getChildCount();
    for (int i = 0; i < childCount; ++i) 
        findCheckableChildren(this.getChildAt(i));
    


/**
 * Read the custom XML attributes
 */
private void initialise(AttributeSet attrs) 
    this.isChecked = false;
    this.checkableViews = new ArrayList<Checkable>(5);


/**
 * Add to our checkable list all the children of the view that implement the
 * interface Checkable
 */
private void findCheckableChildren(View v) 
    if (v instanceof Checkable) 
        this.checkableViews.add((Checkable) v);
    

    if (v instanceof ViewGroup) 
        final ViewGroup vg = (ViewGroup) v;
        final int childCount = vg.getChildCount();
        for (int i = 0; i < childCount; ++i) 
            findCheckableChildren(vg.getChildAt(i));
        
    


【讨论】:

以上是关于带有 RadioButton 单选的自定义 ListView的主要内容,如果未能解决你的问题,请参考以下文章

Dojo RadioButton,以编程方式设置组

解决radiobutton在gridview中无法单选的一种方法

ASP.NET GridView中加入RadioButton不能单选的解决方案

Python3 tkinter基础 Menu add_radiobutton 单选的下拉菜单

单选按钮的自定义布局

RadioButton(单选按钮)