簡體   English   中英

帶有CheckBoxes的Android ListView

[英]Android ListView With CheckBoxes

我找到了一個關於從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();
        }

    }

}

這是示例鏈接

ListView創建CustomAdapter ; 創建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)

看看Android Api演示 也許最好的方法是使用List11.java中的示例。 如果您的行項目實現了Checkable ,則ListView將自行處理並保持檢查位置。 並且不需要在Adapter處理它。

您應該使用自定義適配器,並且可以使用getView方法訪問所有膨脹布局的控件。

包含CheckBoxes的自定義適配器的Listview

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM