【问题标题】:Android Checkbox with Listview and SQLite带有 Listview 和 SQLite 的 Android 复选框
【发布时间】:2014-05-28 14:36:44
【问题描述】:

我创建了一个用户可以存储玩家信息的应用程序。我现在正在寻找一个复选框来确认播放器可用。我知道 sqlite 不能存储布尔值,所以想知道是否有人可以帮助我解决这个问题。我添加了复选框,但目前我将其存储为 0 值,没有任何功能。

下面是显示适配器:

public class DisplayAdapter extends BaseAdapter {
private Context mContext;
private ArrayList<String> id;
private ArrayList<String> firstName;
private ArrayList<String> lastName;
private ArrayList<String> Email;
//private ArrayList<String> ConFirm;


public DisplayAdapter(Context c, ArrayList<String> id,ArrayList<String> fname, ArrayList<String> lname, ArrayList<String> email, ArrayList<String> check) {
    this.mContext = c;

    this.id = id;
    this.firstName = fname;
    this.lastName = lname;
    this.Email = email;
    this.ConFirm = check;
}

public int getCount() {
    // TODO Auto-generated method stub
    return id.size();
}

public Object getItem(int position) {
    // TODO Auto-generated method stub
    return null;
}

public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

public View getView(int pos, View child, ViewGroup parent) {
    Holder mHolder;
    LayoutInflater layoutInflater;
    if (child == null) {
        layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        child = layoutInflater.inflate(R.layout.listcell, null);
        mHolder = new Holder();
        mHolder.txt_id = (TextView) child.findViewById(R.id.txt_id);
        mHolder.txt_fName = (TextView) child.findViewById(R.id.txt_fName);
        mHolder.txt_lName = (TextView) child.findViewById(R.id.txt_lName);
        mHolder.txt_eMail = (TextView) child.findViewById(R.id.txt_eMail);
        mHolder.txt_cOnfirm = (CheckBox) child.findViewById(R.id.txt_cOnfirm);
        child.setTag(mHolder);
    } else {
        mHolder = (Holder) child.getTag();
    }
    mHolder.txt_id.setText(id.get(pos));
    mHolder.txt_fName.setText(firstName.get(pos));
    mHolder.txt_lName.setText(lastName.get(pos));
    mHolder.txt_eMail.setText(Email.get(pos));

    return child;
}

public class Holder {
    TextView txt_id;
    TextView txt_fName;
    TextView txt_lName;
    TextView txt_eMail;
    CheckBox txt_cOnfirm;
}

}

这是来自主活动的显示调用:

private void displayData() {
    dataBase = mHelper.getWritableDatabase();
    Cursor mCursor = dataBase.rawQuery("SELECT * FROM "
            + DbHelper.TABLE_NAME, null);

    userId.clear();
    user_fName.clear();
    user_lName.clear();
    user_eMail.clear();
    user_cOnfirm.clear();
    if (mCursor.moveToFirst()) {
        do {
            userId.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_ID)));
            user_fName.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_FNAME)));
            user_lName.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_LNAME)));
            user_eMail.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_EMAIL)));
            user_cOnfirm.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_CONFIRM)));

        } while (mCursor.moveToNext());
    }
    DisplayAdapter disadpt = new DisplayAdapter(getActivity(),userId, user_fName, user_lName, user_eMail, user_cOnfirm);
    userList.setAdapter(disadpt);
    mCursor.close();
}
{

}

最后是 Dbhelper:

 public class DbHelper extends SQLiteOpenHelper {
public static String DATABASE_NAME="userdata";
public static final String TABLE_NAME="user";
public static final String KEY_FNAME="fname";
public static final String KEY_LNAME="lname";
public static final String KEY_EMAIL="email";
public static final String KEY_CONFIRM="confirm";
public static final String KEY_ID="id";
public DbHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);

}

@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_TABLE="CREATE TABLE " +TABLE_NAME+" ("+KEY_ID+" INTEGER PRIMARY KEY, "+KEY_FNAME+" TEXT, "+KEY_LNAME+" TEXT, "+KEY_EMAIL+" TEXT, "+KEY_CONFIRM+" TEXT DEFAULT 0)";
    db.execSQL(CREATE_TABLE);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);
    onCreate(db);

}

}

如果您想了解更多信息或代码,请告诉我。提前谢谢你。

-----更新------

下面是 FoursFragment.java 类的数据库更新函数:

//add 
    view.findViewById(R.id.btnAdd).setOnClickListener(new OnClickListener() {


        public void onClick(View v) {

            Intent i = new Intent(getActivity(),
                    AddActivity.class);
            i.putExtra("update", false);
            startActivity(i);

        }
    });

//Update
userList.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {

            Intent i = new Intent(getActivity(),
                    AddActivity.class);
            i.putExtra("Confirm", user_cOnfirm.get(arg2));
            i.putExtra("Mail", user_eMail.get(arg2));
            i.putExtra("Fname", user_fName.get(arg2));
            i.putExtra("Lname", user_lName.get(arg2));
            i.putExtra("ID", userId.get(arg2));
            i.putExtra("update", true);
            startActivity(i);

        }
    });




    //delete
    userList.setOnItemLongClickListener(new OnItemLongClickListener() {

        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                final int arg2, long arg3) {

            build = new AlertDialog.Builder(getActivity());
            build.setTitle("Delete " + user_fName.get(arg2) + " "
                    + user_lName.get(arg2) + " " + user_eMail.get(arg2));
            build.setMessage("Do you want to delete ?");
            build.setPositiveButton("Yes",
                    new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface dialog,
                                int which) {

                            Toast.makeText(
                                    getActivity(),
                                    user_fName.get(arg2) + " "
                                            + user_lName.get(arg2)
                                            + " is deleted.", 3000).show();

                            dataBase.delete(
                                    DbHelper.TABLE_NAME,
                                    DbHelper.KEY_ID + "="
                                            + userId.get(arg2), null);
                            displayData();
                            dialog.cancel();
                        }
                    });

            build.setNegativeButton("No",
                    new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface dialog,
                                int which) {
                            dialog.cancel();
                        }
                    });
            AlertDialog alert = build.create();
            alert.show();

            return true;
        }
    });
    return view;
    }
    }}



@Override
public void onResume() {
    displayData();
    super.onResume();
}


//display


@SuppressLint("UseValueOf")
private void displayData() {
    dataBase = mHelper.getWritableDatabase();
    Cursor mCursor = dataBase.rawQuery("SELECT * FROM "
            + DbHelper.TABLE_NAME, null);

    userId.clear();
    user_fName.clear();
    user_lName.clear();
    user_eMail.clear();
    user_cOnfirm.clear();
    if (mCursor.moveToFirst()) {
        do {
            userId.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_ID)));
            user_fName.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_FNAME)));
            user_lName.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_LNAME)));
            user_eMail.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_EMAIL)));
            user_cOnfirm.add(new Boolean((mCursor.getInt(mCursor.getColumnIndex(DbHelper.KEY_CONFIRM)) == 1)));

        } while (mCursor.moveToNext());
    }
    DisplayAdapter disadpt = new DisplayAdapter(getActivity(),userId, user_fName, user_lName, user_eMail, user_cOnfirm);
    userList.setAdapter(disadpt);
    mCursor.close();
}
{

【问题讨论】:

    标签: android sqlite listview checkbox


    【解决方案1】:

    首先你应该改变你的数据库表。不要使用类型“TEXT”来存储布尔值,而是使用类型“TINYINT”。 TINYINT 提供 1 个字节来保存值。因此,您可以定义一个约束(最后的检查),以避免保存像​​ 3 这样的值。

    String CREATE_TABLE="CREATE TABLE " +TABLE_NAME+" ("+KEY_ID+" INTEGER PRIMARY KEY, "+KEY_FNAME+" TEXT, "+KEY_LNAME+" TEXT, "+KEY_EMAIL+" TEXT, "+KEY_CONFIRM+" TINYINT DEFAULT 0, check("+KEY_CONFIRM+"=0 OR "+KEY_CONFIRM+"=1)";
    

    要从数据库中读取值,请更改循环。

      while(mCursor.moveToNext()) {      
            userId.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_ID)));
            user_fName.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_FNAME)));
            user_lName.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_LNAME)));
            user_eMail.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_EMAIL)));
            user_cOnfirm.add(new Boolean((mCursor.getInt(mCursor.getColumnIndex(DbHelper.KEY_CONFIRM)) == 1)));
      }
    

    您请求一个整数而不是字符串作为数据库的返回值。如果需要获取布尔值,可以添加与 1 的比较。

    只是一个提示,你不需要你的do-while。光标指向第一个条目之前的位置的开头。第一次调用 moveToNext 时,您将其移动到第一个条目。如果没有条目,则将跳过循环。

    您需要将 ArrayList 的类型更改为 Boolean(带有大 B)。

    使用复选框的值添加初始化

    mHolder.txt_cOnfirm.setChecked(ConFirm.get(pos));
    

    这些是必要的更改。我在下面添加更改的代码(未测试)

    public class DisplayAdapter extends BaseAdapter {
        private Context mContext;
        private ArrayList<String> id;
        private ArrayList<String> firstName;
        private ArrayList<String> lastName;
        private ArrayList<String> Email; // better name it email
        private ArrayList<Boolean> ConFirm; //better name it confirm, it's one word
    
    
        public DisplayAdapter(Context c, ArrayList<String> id,ArrayList<String> fname, ArrayList<String> lname, ArrayList<String> email, ArrayList<String> check) {
            this.mContext = c;
    
            this.id = id;
            this.firstName = fname;
            this.lastName = lname;
            this.Email = email;
            this.ConFirm = check;
        }
    
        public int getCount() {
            // TODO Auto-generated method stub
            return id.size();
        }
    
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return null;
        }
    
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }
    
        public View getView(int pos, View child, ViewGroup parent) {
            Holder mHolder; // the m shows that this shall be a member variable, this is just local for this method.
            LayoutInflater layoutInflater;
            if (child == null) {
                layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                child = layoutInflater.inflate(R.layout.listcell, null);
                mHolder = new Holder();
                mHolder.txt_id = (TextView) child.findViewById(R.id.txt_id);
                mHolder.txt_fName = (TextView) child.findViewById(R.id.txt_fName);
                mHolder.txt_lName = (TextView) child.findViewById(R.id.txt_lName);
                mHolder.txt_eMail = (TextView) child.findViewById(R.id.txt_eMail);
                mHolder.txt_cOnfirm = (CheckBox) child.findViewById(R.id.txt_cOnfirm);
                child.setTag(mHolder);
            } else {
                mHolder = (Holder) child.getTag();
            }
            mHolder.txt_id.setText(id.get(pos));
            mHolder.txt_fName.setText(firstName.get(pos));
            mHolder.txt_lName.setText(lastName.get(pos));
            mHolder.txt_eMail.setText(Email.get(pos));
            mHolder.txt_cOnfirm.setChecked(ConFirm.get(pos).booleanValue());
            return child;
        }
    
        public class Holder {
            TextView txt_id;
            TextView txt_fName;
            TextView txt_lName;
            TextView txt_eMail;
            CheckBox txt_cOnfirm;
        }
    
        }
    

    你的主要活动部分

    private void displayData() {
        dataBase = mHelper.getWritableDatabase();
        Cursor mCursor = dataBase.rawQuery("SELECT * FROM "
                + DbHelper.TABLE_NAME, null);
    
        userId.clear();
        user_fName.clear();
        user_lName.clear();
        user_eMail.clear();
        user_cOnfirm.clear();
        while(mCursor.moveToNext()) {      
            userId.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_ID)));
            user_fName.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_FNAME)));
            user_lName.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_LNAME)));
            user_eMail.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_EMAIL)));
            user_cOnfirm.add(new Boolean((mCursor.getInt(mCursor.getColumnIndex(DbHelper.KEY_CONFIRM)) == 1)));
      }
        DisplayAdapter disadpt = new DisplayAdapter(getActivity(),userId, user_fName, user_lName, user_eMail, user_cOnfirm);
        userList.setAdapter(disadpt);
        mCursor.close();
    }
    {
    
    }
    

    还有你的 DBHelper

    public class DbHelper extends SQLiteOpenHelper {
    public static String DATABASE_NAME="userdata";
    public static final String TABLE_NAME="user";
    public static final String KEY_FNAME="fname";
    public static final String KEY_LNAME="lname";
    public static final String KEY_EMAIL="email";
    public static final String KEY_CONFIRM="confirm";
    public static final String KEY_ID="id";
    public DbHelper(Context context) {
        super(context, DATABASE_NAME, null, 2); // The 2 is the version. It have to be higher than the old, because we changed the database schema
    
    }
    
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_TABLE="CREATE TABLE " +TABLE_NAME+" ("+KEY_ID+" INTEGER PRIMARY KEY, "+KEY_FNAME+" TEXT, "+KEY_LNAME+" TEXT, "+KEY_EMAIL+" TEXT, "+KEY_CONFIRM+" TINYINT DEFAULT 0, check("+KEY_CONFIRM+"=0 OR "+KEY_CONFIRM+"=1)";
        db.execSQL(CREATE_TABLE);
    
    }
    
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);
        onCreate(db);
    
    }
    
    }
    

    我希望这能解决您的问题,如果不能随意提出其他问题,请将此答案评为肯定。

    附注: 看看编码指南:https://source.android.com/source/code-style.html

    【讨论】:

    • 非常感谢您抽出宝贵时间提供帮助!我已经更新了您提供给我的所有信息,但目前表格的“确认”列仍然没有任何价值。勾选复选框后,该行仍停留在“0”吗?
    • 只是想知道您是否知道为什么会这样?似乎单击复选框没有初始化任何内容?
    • 您还没有发布任何代码来保存数据库中的数据,因此数据库不会更新。如果您可以发布更新数据库的代码来帮助您,那就太好了。要自动更新数据,请实现一个侦听器,该侦听器调用数据库更新,并使用 setOnCheckChangedListener 进行设置。
    • 我已经很好地了解了使用监听器并调用数据库更新,但我发现很难实现它。我之前使用过带有 toast 的复选框,但从未更新过数据库。我是在监听器中调用数据库还是从监听器调用更新?混乱来袭:s 抱歉有这么多问题,我会确保您的答案在有效时获得最大的喜欢! :D
    • 您好,我已经添加了更新上面数据库的代码。如果您可以看看并告诉我需要进行哪些更改,我将不胜感激:)!谢谢。
    猜你喜欢
    • 2011-09-15
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 2011-04-26
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多