为什么无法检查listview中的自定义复选框

时间:2013-09-26 01:48:15

标签: android listview

我正在尝试在listview中设置我的复选框的选中状态,这是代码:

mShalatAdapter = new ArrayAdapter<String>(getActivity(),R.layout.pengaturan_list_item, R.id.label_shalat, waktuShalat);

mListShalat = (ListView) v.findViewById(R.id.pengaturan_checkbox);
mListShalat.setAdapter(mShalatAdapter);

CheckBox cb;
TextView txv;
for (int i = 0; i < mListShalat.getCount(); i++) {
    View vListSortOrder = mListShalat.getAdapter().getView(i, null, null);
    txv = (TextView) vListSortOrder.findViewById(R.id.label_shalat);
    cb = (CheckBox) vListSortOrder.findViewById(R.id.status_shalat);

    String labelShalat = txv.getText().toString();
    Toast.makeText(getActivity(), labelShalat, Toast.LENGTH_SHORT).show();
    if (cb.isChecked() == false) {
        cb.setChecked(true);
    }
}

这是我的pengaturan_list_item.xml布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_vertical|center_horizontal"
    android:orientation="horizontal"
    android:paddingBottom="5dp"
    android:paddingTop="5dp" >

    <TextView
        android:id="@+id/label_shalat"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:paddingLeft="10dp"
        android:text="Label Ibadah"
        android:textColor="@android:color/white"
        android:textSize="20dp" />

    <CheckBox
        android:id="@+id/status_shalat"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:button="@drawable/ibadah_checkbox_list"
        android:visibility="visible" />

</LinearLayout>

我得到了TextView和CheckBox的值,但我不知道为什么CheckBox没有在设备中显示真实状态。请提前帮助,谢谢。

我的ibadah_checkbox_list.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_checked="true"
        android:drawable="@drawable/checkbox_ibadah_checked" />
    <item android:state_checked="false"
        android:drawable="@drawable/checkbox_ibadah_unchecked" />
</selector>

3 个答案:

答案 0 :(得分:0)

可能值得改变适配器的工作方式。

不是创建标准的ArrayAdapter,而是尝试继承它,然后从getView()方法中的list_item.xml中膨胀视图。

在那里,您可以从视图中提取复选框,就像您在循环中所做的那样。根据您的需要设置其值。这是做这样事情的标准方式。

我猜你正在做的事情不起作用的是ArrayAdapter在需要显示视图时创建视图,而不是在你正在使用的循环中,所以当它生成并给你视图时您正在请求它们,这些视图不一定是显示的视图。

我将如何做到这一点:

public class MyArrayAdapter extends ArrayAdapter<String>
    {
        public MyArrayAdapter(Context context, int textViewResourceId, List<String> objects)
        {
            super(context, textViewResourceId, objects);
        }

        public View getView(int position, View convertView, ViewGroup parent)
        {
            View v = convertView;

            if(v == null)
            {
                LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
                v = vi.inflate(R.layout.pengaturan_list_item, null);
            }

            TextView tv = (TextView)v.findViewById(R.id.label_shalat);
            CheckBox cb = (CheckBox)v.findViewById(R.id.status_shalat);

            tv.setText(getItem(position));

            if (!cb.isChecked())
                cb.setChecked(true);

            return v;
        }
    }

然后,像这样设置适配器(objectList是标签的字符串列表):

mShalatAdapter = new MyArrayAdapter(this, R.layout.pengaturan_list_item, objectList);
mListShalat = (ListView) v.findViewById(R.id.pengaturan_checkbox);
mListShalat.setAdapter(mShalatAdapter);

希望这会有所帮助:)

答案 1 :(得分:0)

我认为问题在于你的布局。您的TextView有一个layout_width match_parent,其中涵盖了CheckBox并填充了整个宽度布局。所以你需要正确划分布局。

尝试下面的布局并告诉我效果。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_vertical|center_horizontal"
    android:orientation="horizontal"
    android:paddingBottom="5dp"
    android:weightSum="2"
    android:paddingTop="5dp" >

    <TextView
        android:id="@+id/label_shalat"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:paddingLeft="10dp"
        android:text="Label Ibadah"
        android:textColor="@android:color/white"
        android:background="@android:color/black"
        android:textSize="20dp" />

    <CheckBox
        android:id="@+id/status_shalat"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:button="@drawable/ibadah_checkbox_list"
        android:visibility="visible" />
</LinearLayout>

答案 2 :(得分:0)

在ListView.Hope中添加android:descendantFocusability="blocksDescendants"它有效....