Search code examples
androidcheckmark

CheckedTextView checkmark in ListView row not showing up


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?


Solution

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