Checkbox value is true but tick is not showing - Android / Java

Viewed 2147

Basically here I have three(3) checkbox list in three(3) different fragment. When I open the activity, my checkbox in the default fragment display like normal, but the one in different fragment display differently. The value of the checkbox is still true. Below is the image for the checkbox to make things clearer and also my code.

First fragment page:

enter image description here

Second fragment page:

enter image description here

Code for setting up the checkbox and its if condition

private void setCheckBox(ArrayList<DataPrefType> arrayList){
    for(int i = 0; i < arrayList.size(); i++){
        id = i + 1;
        checkBox = new CheckBox(getActivity());
        checkBox.setId(i + 1);
        checkBox.setText(arrayList.get(i).getName());
        checkBox.setPadding(10, 10, 10, 10);
        checkBox.setLayoutParams(params);
        checkBox.setGravity(Gravity.CENTER);
        checkBoxLayout.addView(checkBox);

        if(!userPreference.isEmpty() || userPreference != null){
            for(int j = 0; j < userPreference.get(0).getDataPrefTypeArrayList().size(); j++){
                int retrieveId = Integer.parseInt(userPreference.get(0).getDataPrefTypeArrayList().get(j).getId());
                if(checkBox.getId() == retrieveId)
                    checkBox.setChecked(true);
            }
        }
3 Answers

The bug with the checkboxes not showing as checked even though isChecked is true is within the animation of the draw.

I found this solution here. I am posting it here as an answer to make it easier to find and including some extra information about how to call it.

Try calling jumpDrawablesToCurrentState on the root view (or parent view of your check boxes). If specifically calling to checkBox.setChecked(true); as OP is, call this after. In this question, it would be important to call this after all checkboxes have been added to the parent view. This essentially will draw all drawables in the current state, skipping the animation process.

Example:

@Override
public void onStart() {
    View v = getView();
    if(v != null) {
        CheckBox chkYourCheckBox = (CheckBox)v.findViewById(R.id.chkYourCheckBox);
        chkYourCheckBox.setChecked(true); //sometimes this may draw fine, and other times it may not
        //***The important line:
        v.jumpDrawablesToCurrentState();
    }
}

I created this Kotlin extension property to deal with the problem (obviously only useful if you are writing Kotlin code, not Java)

/**
 * Set the state of a checkbox skipping animations.
 */

var CheckBox.checked: Boolean
    get() = isChecked
    set(value) {
        if(isChecked != value) {
            isChecked = value
            jumpDrawablesToCurrentState()
        }
    }

Now in my code I write checkbox_view.checked = true instead of checkbox_view.isChecked = true

Related