Friday, December 26, 2014

Android Listview with Checkbox (Custom Adapter)

Hi Guys!

Today I'm going to share with you how to add Checkbox on your Listview  and getting all selected values in your list.

IDE - Android Studio 1.0
Reference: BaseAdapter

Process Flow of the App:

















Java codes that you needed:

1. Item.java
package com.example.user.listviewxcheckbox;

public class Item {

    String name;
    boolean checkbox;

    public Item() {
         /*Empty Constructor*/
    }
    public  Item(String country, boolean status){
        this.name = country;
        this.checkbox = status;
    }
    //Getter and Setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isCheckbox() {
        return checkbox;
    }

    public void setCheckbox(boolean checkbox) {
        this.checkbox = checkbox;
    }

}

2. ItemSelectedAdapter.java
package com.example.user.listviewxcheckbox;

import android.view.LayoutInflater;
import java.util.ArrayList;
import android.view.View;
import android.view.ViewGroup;
import android.content.Context;
import android.widget.BaseAdapter;
import android.widget.*;
/**
 * Created by Eugene Alvizo on 12/26/2014.
 */
public class ItemSelectedAdapter extends BaseAdapter{

    private Context activity;
    private ArrayList<item> data;
    private static LayoutInflater inflater = null;
    private View vi;
    private ViewHolder viewHolder;

    public ItemSelectedAdapter(Context context, ArrayList&lt;Item&gt;<item> items) {
        this.activity = context;
        this.data = items;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int i) {
        return i;
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {
        vi = view;
      //Populate the Listview
        final int pos = position;
        Item items = data.get(pos);
        if(view == null) {
            vi = inflater.inflate(R.layout.listview_item, null);
            viewHolder = new ViewHolder();
            viewHolder.checkBox = (CheckBox) vi.findViewById(R.id.checkbox);
            viewHolder.name = (TextView) vi.findViewById(R.id.name);
            vi.setTag(viewHolder);
        }else
            viewHolder = (ViewHolder) view.getTag();
        viewHolder.name.setText(items.getName());
        if(items.isCheckbox()){
            viewHolder.checkBox.setChecked(true);
        }
        else {
            viewHolder.checkBox.setChecked(false);
        }
        return vi;
    }
    public ArrayList<item> getAllData(){
        return data;
    }
    public void setCheckBox(int position){
       //Update status of checkbox
        Item items = data.get(position);
        items.setCheckbox(!items.isCheckbox());
        notifyDataSetChanged();
    }

    public class ViewHolder{
        TextView name;
        CheckBox checkBox;
    }
}


3. MainActivity.java

package com.example.user.listviewxcheckbox;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;


public class MainActivity extends ActionBarActivity {
    private  Item itemHandler;
    private ItemSelectedAdapter adapter;
    private ArrayList<item> itemList;
    private ListView listView;
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView =(ListView) findViewById(R.id.listview);
        button = (Button) findViewById(R.id.printbtn);
        setWidget();
    }
    public void setWidget(){
       //Adding data to ArrayList
        itemList = new ArrayList&lt;Item&gt;<item>();
        itemList.add(new Item("Philippines", false));
        itemList.add(new Item("America", false));
        itemList.add(new Item("Thailand", false));
        itemList.add(new Item("Korea", false));
        itemList.add(new Item("Japan", false));
        itemList.add(new Item("China", false));
        itemList.add(new Item("Australia", false));
        itemList.add(new Item("Canada", false));
        itemList.add(new Item("Italy", false));
        itemList.add(new Item("Iraq", false));
        //Setup Adapter for Listview
        adapter = new ItemSelectedAdapter(MainActivity.this,itemList);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView adapterView, View view, int position, long l) {
               //Item Selected from list
                adapter.setCheckBox(position);

            }
        });

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               //Display All Item Selected
                String countries = "";
                for(Item hold: adapter.getAllData()){
                    if(hold.isCheckbox()){
                        countries += " "  + hold.getName();
                    }
                }
                Toast.makeText(MainActivity.this,"Names: " + countries,Toast.LENGTH_SHORT).show();
            }
        });

    }
}
XML(Layouts) codes that you needed:

1.activity_main.xml
<LinearLayout 
      android:layout_height="match_parent" 
      android:layout_width="match_parent" 
      android:orientation="vertical" 
      tools:context=".MainActivity" 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools">

    <ListView 
      android:id="@+id/listview" 
      android:layout_height="514dp" 
      android:layout_width="fill_parent"/>
    <Button 
      android:id="@+id/printbtn"
      android:layout_height="fill_parent" 
      android:layout_width="fill_parent" 
      android:text="Print"/>
   
 </LinearLayout>
2.listview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:descendantFocusability="blocksDescendants">
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="horizontal"
        android:gravity="center">
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:gravity="center_vertical"
            android:paddingLeft="30dp"
            android:layout_weight=".8">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Item"
                android:id="@+id/name"
                android:focusable="false"/>
        </LinearLayout>
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight=".1">
            <CheckBox
                android:layout_width="45dp"
                android:layout_height="45dp"
                android:checked="true"
                android:focusable="false"
                android:clickable="false"
                android:id="@+id/checkbox" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

OUTPUT:






Download Source Code