user1831490
user1831490

Reputation:

Android ListView With CheckBoxes

I've found a sample about populating a listView from a database in android,it works well,but I want to add some functionality to this application,I want to put a checkbox next to each item in my listview and when the user checks each item he will be able to delete that item by pressing a Confirm button.I've put these lines to make the multiple choice enabled,but the checkbox does not appear and I don't know how to delete the selected Item !

ListView lstView = getListView();

            lstView.setChoiceMode(2);




    public void onListItemClick(
                    ListView parent, View v, int position, long id)
                    {
                    //---toggle the check displayed next to the item---
                    parent.setItemChecked(position, parent.isItemChecked(position));

                    }

Would you please help me solve my issue?

Here is my Code:

package com.saigmn;

import java.util.ArrayList;

import android.app.ListActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class DataListView extends ListActivity {

    private ArrayList<String> results = new ArrayList<String>();
    private String tableName = DBHelper.tableName;
    private SQLiteDatabase newDB;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        openAndQueryDatabase();

        displayResultList();


    }
    private void displayResultList() {
        TextView tView = new TextView(this);
        tView.setText("This data is retrieved from the database and only 4 " +
                "of the results are displayed");
        getListView().addHeaderView(tView);

        setListAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, results));
        getListView().setTextFilterEnabled(true);


        ////----------------------
        ListView lstView = getListView();
        //lstView.setChoiceMode(0); //CHOICE_MODE_NONE
        //lstView.setChoiceMode(1); //CHOICE_MODE_SINGLE
        lstView.setChoiceMode(2);

       // setListAdapter(new ArrayAdapter<String>(this,
               // android.R.layout.activity_list_item));
    }

    //--------------------------------

    public void onListItemClick(
            ListView parent, View v, int position, long id)
            {
            //---toggle the check displayed next to the item---
            parent.setItemChecked(position, parent.isItemChecked(position));

            }


    private void openAndQueryDatabase() {
        try {
            DBHelper dbHelper = new DBHelper(this.getApplicationContext());
            newDB = dbHelper.getWritableDatabase();
            Cursor c = newDB.rawQuery("SELECT FirstName, Age FROM " +
                    tableName +
                    " where Age > 10 LIMIT 4", null);

            if (c != null ) {
                if  (c.moveToFirst()) {
                    do {
                        String firstName = c.getString(c.getColumnIndex("FirstName"));
                        int age = c.getInt(c.getColumnIndex("Age"));
                        results.add("Name: " + firstName + ",Age: " + age);
                    }while (c.moveToNext());
                } 
            }           
        } catch (SQLiteException se ) {
            Log.e(getClass().getSimpleName(), "Could not create or Open the database");
        } finally {
            if (newDB != null) 
                newDB.execSQL("DELETE FROM " + tableName);
                newDB.close();
        }

    }

}

And here is the Link Of Example

Upvotes: 1

Views: 9287

Answers (3)

Veaceslav Gaidarji
Veaceslav Gaidarji

Reputation: 4311

Create CustomAdapter for ListView; create layout_row, which represents row in your ListView, and has structure - [text] [radio_button]

public class CustomAdapter extends BaseAdapter {
    private LayoutInflater inflater;
    private Activity activity;
    private ArrayList<String> listItems;
    private RadioButton listRadioButton = null;

    // NOTE: not the best practice to use static fields
    public static int selectedIndex;

    public CustomerListAdapter(Activity activity) {
        this.activity = activity;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        listItems = new ArrayList<String>();
    }

    public void addItem(final String item) {
        listItems.add(item);
        notifyDataSetChanged();
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent){
        ViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_row, null);
            holder = new ViewHolder();
            holder.text = (TextView)convertView.findViewById(R.id.text);
            holder.radioButtonChooser = (RadioButton)convertView.findViewById(R.id.radioButtonChooser);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder)convertView.getTag();
        }

        holder.text.setText((listItems.get(position)).getText());

        holder.radioButtonChooser.setChecked(false);

        holder.radioButtonChooser.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    // uncheck previous checked button. 
                    if (listRadioButton != null) 
                        listRadioButton.setChecked(false);

                    // assign to the variable the new one
                    listRadioButton = (RadioButton) v;

                    // find if the new one is checked or not, and save "selectedIndex"
                    if (listRadioButton.isChecked()) {
                       selectedIndex = position;

                            // pass this index in your delete function
                            // get item from your list by this index 
                            // and delete row from list
                    } else {
                                    // nothing is selected
                        listRadioButton = null;
                                    selectedIndex = -1;
                    }
            }
        });

        return convertView;
    }

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

    @Override
    public Object getItem(int position) {
        return listItems.get(position);
    }

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

    /**
     * Represents list row structure
     */
public  class ViewHolder{
    public TextView text;
    public RadioButton radioButtonChooser;
}

...

private void fillList(){
        CustomAdapter adapter = new CustomAdapter(activity);

        ArrayList<String> items = new ArrayList<String>();
                // fill "items" array with your list data

        for (String item : items) {
            adapter.addItem(item);
        }

        listView.setAdapter(adapter);
}

...

list_row Layout contains 2 Views - TextView (id = text), RadioButton (id = radioButtonChooser)

Upvotes: 2

nfirex
nfirex

Reputation: 1523

Look at Android Api Demos. Maybe best way is use example from List11.java. If your row item implements Checkable, the ListView will handle and keep checked position by itself. And don't need handle it in your Adapter.

Upvotes: 1

Talha
Talha

Reputation: 12717

You should use your custom adapter, and you can reach all inflated layout's controls its getView method.

Listview with custom adapter containing CheckBoxes

http://www.ezzylearning.com/tutorial.aspx?tid=1763429

Upvotes: 0

Related Questions