Reputation:
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
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
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
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