Android

Checkbox Unchecked on ListView scroll Android

Checkbox Unchecked: It’s a common problem with beginners in android application development once they implement a checkbox in ListView that automatically gets unchecked while scrolling. In this tutorial, we will learn how to avoid this problem. We will implement a custom adapter with a custom row having checkboxes and titles.

1. App name, Package name, and Project location.

Create a new project with the name CheckBoxListView and package name com.tutorialscache.checkboxchecklist.

2. Choose Empty Activity

3. activity_main.xml

Add a Custom ListView using BaseAdapter inside activity_main.xml and assign id listView.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#e9e9e9"
    tools:context="com.tutorialscache.checkboxlistview.MainActivity">
     <ListView
      android:id="@+id/listview_list"
      android:layout_width="match_parent"
      android:layout_height="match_parent">
     </ListView>
</LinearLayout>

4. Custom Row movie_row.xml

Right-click on layout and create new > Layout Resource File. This row will be used by the adapter to render each movie item.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:background="#f7f7f7">
    <TextView
        android:id="@+id/movieNameTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="10dp"
        android:textSize="20sp"
        android:textStyle="bold"
        android:textColor="#000"/>
    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        />
</RelativeLayout>

5. Create model MovieModel.java

5.1 Right-click on the Package name > New > Java Class and give the model name MovieModel and click Ok. 

5.2 Create Getters and Setters

Press Alt +Insert to Generate Getter and Setter.

package com.tutorialscache.checkboxlistview;
public class MoviesModel {
    int id;
    String moviename;
    boolean ischecked;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getMoviename() {
        return moviename;
    }
    public void setMoviename(String moviename) {
        this.moviename = moviename;
    }
    public boolean isIschecked() {
        return ischecked;
    }
    public void setIschecked(boolean ischecked) {
        this.ischecked = ischecked;
    }
}

6. MoviesAdapter.java

Create a new java class and name as MoviesAdapter by clicking on package name > New > Java Class. Extend with BaseAdapter following cmd+insert to implement methods.

Full MoviesAdapter.java Code.

Tag is one of the most important things in android development to get the position of clicked view. In our case, we will set a position as a tag on our checkbox and we will get tag when the checkbox is clicked. As a result, we will be able to get the exact position of the clicked view which will help to change isChecked state to true/false.

package com.tutorialscache.checkboxlistview;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.TextView;
import java.util.ArrayList;
public class MoviesAdapter extends BaseAdapter {
    private Context context;
    private ArrayList<MovieModel> moviesData;
    private LayoutInflater layoutInflater;
    private MovieModel movieModel;
    public MoviesAdapter(Context context, ArrayList<MovieModel> moviesData) {
        this.context = context;
        this.moviesData = moviesData;
        layoutInflater= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public int getCount() {;
        return moviesData.size();
    }
    @Override
    public Object getItem(int position) {
        return moviesData.get(position);
    }
    @Override
    public long getItemId(int position) {
        return moviesData.get(position).getId();
    }
    @Override
    public View getView(int position, View view, ViewGroup parent) {
        View rowView=view;
        if(rowView==null)
        {
            rowView=layoutInflater.inflate(R.layout.movies_row,parent,false);
        }
            TextView moviesName=(TextView)rowView.findViewById(R.id.movieNameTv);
            CheckBox checkBox=(CheckBox)rowView.findViewById(R.id.checkbox);
            movieModel = moviesData.get(position);
            moviesName.setText(movieModel.getMoviename());
            checkBox.setChecked(movieModel.isIschecked());
            // Tag is important to get position clicked checkbox
            checkBox.setTag(position);
            checkBox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int currentPos = (int) v.getTag();
                    boolean isChecked = false;
                    if (moviesData.get(currentPos).isIschecked()==false){
                        isChecked=true;
                    }
                    Log.d("response ",currentPos+ " "+isChecked);
                    moviesData.get(currentPos).setIschecked(isChecked);
                    notifyDataSetChanged();
                }
            });
            return rowView;
    }
}

7. MainActivity.java

Full MainActivity.java Code.

package com.tutorialscache.checkboxlistview;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
    ListView mlistView;
    Context context;
    ArrayList<MovieModel> moviesData;
    MoviesAdapter moviesAdapter;
    MovieModel movieModel;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = this;
        setContentView(R.layout.activity_main);
        //getviews
        mlistView = findViewById(R.id.listview_list);
        moviesData = new ArrayList<>();
        //add Countries Data
        addMoviesData();
        moviesAdapter =new MoviesAdapter(context,moviesData);
        mlistView.setAdapter(moviesAdapter);
    }
    private void addMoviesData() {
        //Movie1
        movieModel =new MovieModel();
        movieModel.setId(1);
        movieModel.setMoviename("Avangers");
        movieModel.setIschecked(false);
        moviesData.add(movieModel);
        //Movie2
        movieModel =new MovieModel();
        movieModel.setId(2);
        movieModel.setMoviename("InfinityWar");
        movieModel.setIschecked(false);
        moviesData.add(movieModel);
        //Movie3
        movieModel =new MovieModel();
        movieModel.setId(3);
        movieModel.setMoviename("Need For Speed");
        movieModel.setIschecked(false);
        moviesData.add(movieModel);
        //Movie4
        movieModel =new MovieModel();
        movieModel.setId(4);
        movieModel.setMoviename("Deadpool");
        movieModel.setIschecked(false);
        moviesData.add(movieModel);
        //Movie5
        movieModel =new MovieModel();
        movieModel.setId(5);
        movieModel.setMoviename("War");
        movieModel.setIschecked(false);
        moviesData.add(movieModel);
        //Movie6
        movieModel =new MovieModel();
        movieModel.setId(6);
        movieModel.setMoviename("Twilight");
        movieModel.setIschecked(false);
        moviesData.add(movieModel);
        //Movie7
        movieModel =new MovieModel();
        movieModel.setId(7);
        movieModel.setMoviename("Twilight saga");
        movieModel.setIschecked(false);
        moviesData.add(movieModel);
        //Movie8
        movieModel =new MovieModel();
        movieModel.setId(8);
        movieModel.setMoviename("ABCD");
        movieModel.setIschecked(false);
        moviesData.add(movieModel);
        //Movie9
        movieModel =new MovieModel();
        movieModel.setId(9);
        movieModel.setMoviename("ABCD2");
        movieModel.setIschecked(false);
        moviesData.add(movieModel);
        //Movie10
        movieModel =new MovieModel();
        movieModel.setId(10);
        movieModel.setMoviename("Dhoom");
        movieModel.setIschecked(false);
        moviesData.add(movieModel);
        //Movie11
        movieModel =new MovieModel();
        movieModel.setId(11);
        movieModel.setMoviename("See");
        movieModel.setIschecked(false);
        moviesData.add(movieModel);
        //Movie12
        movieModel =new MovieModel();
        movieModel.setId(12);
        movieModel.setMoviename("Batman");
        movieModel.setIschecked(false);
        moviesData.add(movieModel);
        //Movie13
        movieModel =new MovieModel();
        movieModel.setId(13);
        movieModel.setMoviename("Man Of Steel");
        movieModel.setIschecked(false);
        moviesData.add(movieModel);
        //Movie14
        movieModel =new MovieModel();
        movieModel.setId(14);
        movieModel.setMoviename("Age of Altron");
        movieModel.setIschecked(false);
        moviesData.add(movieModel);
        //Movie15
        movieModel =new MovieModel();
        movieModel.setId(15);
        movieModel.setMoviename("Ender Games");
        movieModel.setIschecked(false);
        moviesData.add(movieModel);
        //Movie16
        movieModel =new MovieModel();
        movieModel.setId(16);
        movieModel.setMoviename("Speed");
        movieModel.setIschecked(false);
        moviesData.add(movieModel);
    }
}

Final Output of the app

Final App

Relevant: How to integrate Google AdMob into Android Application.

Comments are closed.