为什么我的自定义布局片段不会检查给定的checkedItem

时间:2013-12-19 13:46:23

标签: java android android-listview android-dialogfragment

我有一个DialogFragment,它显示带有单选按钮的单选项。

这是我的代码:

   SimpleAdapter simpleAdapter = new SimpleAdapter(
    getActivity(),
    listItem, //this is a hashmap
    R.layout.my_custom_list_item,
    new String[] { "id", "name", "status" },
    new int[] { R.id.textview_ID, R.id.textview_name, R.id.textview_status });
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle("Title").setSingleChoiceItems(simpleAdapter, 0, //check the first item
    new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInteface,int position) {
            //do something
        }
        }).setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog,int id) {
            //do something
        }
    });

我在另一个地方使用ArrayAdapterandroid.R.layout.simple_list_item_single_choice,并检查第一项。请注意,我已将0提供给checkedItem参数。我认为我的自定义布局存在问题。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout01"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingLeft="10sp"
    android:paddingRight="10sp"
    android:paddingTop="2sp" >

        <RadioButton
            android:id="@+id/selected_cert"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginRight="15dp" />

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/textview_ID"
                android:layout_width="fill_parent"
                android:layout_height="29dp"
                android:layout_marginTop="5dp"
                android:textSize="16sp"
                android:textStyle="bold"
                android:typeface="sans" >
            </TextView>

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="28dp" >

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Name :"
                    android:textSize="13sp"
                    android:textStyle="bold" >
                </TextView>

                <TextView
                    android:id="@+id/textview_name"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textSize="13sp" >
                </TextView>
            </LinearLayout>

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="30dp" >

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Satatus:"
                    android:textSize="13sp"
                    android:textStyle="bold" />

                <TextView
                    android:id="@+id/textview_qualifiedstatus"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textSize="13sp" />
            </LinearLayout>
        </LinearLayout>
</LinearLayout>

如何在用户打开对话框片段时选择第一个自定义项目。

1 个答案:

答案 0 :(得分:1)

我发现我需要创建自定义LinearLayout并实现Checkable接口。然后将其用作列表项的根视图。

我的自定义LinearLayout:

public class CheckableLinearLayout extends LinearLayout implements Checkable {
    RadioButton mRadioButton;

    public CheckableLinearLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public CheckableLinearLayout(Context context) {
        super(context);
    }

    public CheckableLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        findCheckableView(this);
    }

    //finds RadioButton recursively (comment if you know a better way to do that)
    void findCheckableView(ViewGroup parent) {
        for (int i = 0; i < parent.getChildCount(); i++) {
            View child = parent.getChildAt(i);
            if (child instanceof ViewGroup) {
                findCheckableView((ViewGroup) child);
            } else if (child != null) {
                if (child instanceof RadioButton) {
                    mRadioButton = (RadioButton) child;
                }
            }
        }
    }

    @Override
    public void setChecked(boolean checked) {
        if (mRadioButton != null) {
            mRadioButton.setChecked(checked);
        }
    }

    @Override
    public boolean isChecked() {
        return mRadioButton != null ? mRadioButton.isChecked() : false;
    }

    @Override
    public void toggle() {
        if (mRadioButton != null) {
            mRadioButton.toggle();
        }
    }
}

我的列表项

<com.foo.customViews.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout01"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingLeft="10sp"
    android:paddingRight="10sp"
    android:paddingTop="2sp" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="87dp"
        android:orientation="horizontal" >

        <RadioButton
            android:id="@+id/radio"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginRight="15dp" />

            <TextView
                android:id="@+id/tv"
                android:layout_width="fill_parent"
                android:layout_height="29dp"
                android:layout_marginTop="5dp"
                android:textSize="16sp"
                android:textStyle="bold"
                android:typeface="sans" >
            </TextView>
    </LinearLayout>
    <!-- some more views -->
</com.foo.customViews.CheckableLinearLayout>

这篇文章对我有所帮助: http://tokudu.com/post/50023900640/android-checkable-linear-layout