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
Relevant: How to integrate Google AdMob into Android Application.
Comments are closed.