Android ListView With CheckBoxes

匿名 (未验证) 提交于 2019-12-03 02:33:02

问题:

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

回答1:

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)



回答2:

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.



回答3:

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



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!