2

I have a problem with the Checkmark of my ListView row layout. The checkmark doesn't show up when the ListItem is clicked even though the ListView works (the interaction works). How can i fix this problem?

user1617102
  • 61
  • 2
  • 9

1 Answers1

3

You will want to make you custom row layout that is checkable.

First you need to create a custom layout that implements 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();
    }
}

After this layout is inflated it looks through it's children for one that is checkable (like a CheckedTextView or CheckBox), other than that it is quite simple.

Next use it in a layout:

<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>

Notice that you cannot just use CheckableLinearLayout, since it is not a built-in Android View you need tell the compiler where it is. Save this as checkable_list_row.xml, for example.

Lastly use this new layout like you would with any other custom layout.

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

Hope that helps!

Sam
  • 86,580
  • 20
  • 181
  • 179
  • The checkmark works again, but now there's the problem that R.id.text2 is invisible and only shows up when the ListItem is pressed. – user1617102 Aug 25 '12 at 21:53
  • Sorry that is a quirk from the `textAppearance` attribute I removed it and updated the answer. – Sam Aug 25 '12 at 22:04
  • The problem is still there plus the text color has changed to grey when nothing is pressed or highlighted. – user1617102 Aug 25 '12 at 22:09
  • Ok it's working. The textAppearace didn't allow textColor and textSize. I rechecked and now it's working. Thank you! – user1617102 Aug 25 '12 at 22:19