ListView行中的CheckedTextView复选标记未显示

时间:2012-08-25 21:27:20

标签: android checkmark

我的ListView行布局的Checkmark有问题。即使ListView正常工作(交互工作),单击ListItem时也不会显示复选标记。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

您需要制作可检查的自定义行布局。

首先您需要创建一个实现Checkable的自定义布局:

public class CheckableLinearLayout extends LinearLayout implements Checkable {
    private Checkable mCheckable;

    public CheckableLinearLayout(Context context) {
        this(context, null);
    }

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

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

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

        // Find Checkable child
        int childCount = getChildCount();
        for (int i = 0; i < childCount; ++i) {
            View v = getChildAt(i);
            if (v instanceof Checkable) {
                mCheckable = (Checkable) v;
                break;
            }
        }
    }

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

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

在这个布局膨胀之后,它会查看它的子项是否可以检查(比如CheckedTextView或CheckBox),除此之外它非常简单。

下一步在布局中使用它:

<your.package.name.CheckableLinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:gravity="center_vertical" >

    <TextView 
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <CheckedTextView 
        android:id="@+id/text2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:checkMark="?android:attr/textCheckMark"
        android:gravity="center_vertical"
        android:paddingLeft="6dp"
        android:paddingRight="6dp" />

</your.package.name.CheckableLinearLayout>

请注意,您不能只使用CheckableLinearLayout,因为它不是内置的Android视图,您需要告诉编译器它在哪里。例如,将其保存为checkable_list_row.xml。

最后使用此新布局,就像使用任何其他自定义布局一样。

adapter = new MySimpleCursorAdapter(this, R.layout.checkable_list_row, cursor,
        new String[] { Database.KEY_DATE , Database.KEY_NAME },
        new int[] {R.id.text1, R.id.text2}, 0);

希望有所帮助!