带有CheckBoxes的Android ListView

时间:2012-12-25 11:16:53

标签: android database sqlite listview checkbox

我找到了一个关于从android中的数据库填充 listView 的示例,它运行良好,但我想为此应用程序添加一些功能,我想要添加一个复选框 listview 中的每个项目旁边,当用户检查每个项目时,他可以通过按下确认按钮删除该项目。我已将这些行放到启用了多项选择,但复选框未显示,我不知道如何删除所选项目!

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));

                    }

你能帮我解决一下我的问题吗?

这是我的代码:

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();
        }

    }

}

这是Link Of Example

3 个答案:

答案 0 :(得分:2)

CustomAdapter创建ListView;创建layout_row,代表ListView中的行,并具有结构 - [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包含2 Views - TextView (id = text), RadioButton (id = radioButtonChooser)

答案 1 :(得分:1)

看看Android Api Demos。也许最好的方法是使用List11.java中的示例。如果您的行项目实现CheckableListView将自行处理并保持检查位置。并且不需要在Adapter中处理它。

答案 2 :(得分:0)

您应该使用自定义适配器,并且可以使用getView方法访问所有膨胀布局的控件。

Listview with custom adapter containing CheckBoxes

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