复选框:项目选择-ANDROID

复选框:项目选择-ANDROID,android,listview,checkbox,baseadapter,Android,Listview,Checkbox,Baseadapter,当我选中复选框中的项目时,也会选中其他项目。 我的应用程序有一个联系人姓名的列表视图和复选框。此外,用户还可以在列表中选择多个名称 我有三节课 公开课选秀活动 公共类SelectUserAdapter 公共类SelectUserManager 谢谢你的帮助 选择性接触活动 public class ChoisirContactActivity extends ListActivity implements View.OnClickListener { // ArrayList ArrayLis

当我选中
复选框中的项目时,也会选中其他项目。
我的应用程序有一个联系人姓名的列表视图和复选框。此外,用户还可以在列表中选择多个名称

我有三节课

  • 公开课选秀活动
  • 公共类SelectUserAdapter
  • 公共类SelectUserManager
  • 谢谢你的帮助

    选择性接触活动

    public class ChoisirContactActivity extends ListActivity implements View.OnClickListener {
    
    // ArrayList
    ArrayList<SelectUser> selectUsers;
    SelectUser selectUser;
    List<SelectUser> temp;
    // Contact List
    ListView listView;
    // Cursor to load contacts list
    Cursor phones, email;
    
    // Pop up
    ContentResolver resolver;
    SearchView search;
    SelectUserAdapter adapter;
    private SelectUserManager usermanager;
    String arrData[][];
    
    
    private Button btnSend;
    private Poste poste;
    private String dest1, dest2, dest3, dest4, dest5, yuyu;
    private CheckBox check;
    private PosteManager postmanager;
    private Intent poste2Intent;
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_choisir_contact);
    
        selectUsers = new ArrayList<SelectUser>(); 
    
        resolver = this.getContentResolver();
        // listView = (ListView) findViewById(R.id.list);
    
        usermanager = new SelectUserManager(this);
    
    
        phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
        LoadContact loadContact = new LoadContact();
        loadContact.execute();
    
        Intent data = getIntent();
        poste = data.getParcelableExtra("yuyu");
        btnSend = (Button) findViewById(R.id.btSend);
        btnSend.setOnClickListener(this);
    
        postmanager = new PosteManager(this);
    }
    
    
    @Override
    public void onClick(View v) {
        dest1 = "Mehdi";
        dest2 = "Bouma";
        dest3 = "Benani";
        dest4 = "Anis";
        dest5 = "Saad";
    
        poste.setDest1(dest1);
        poste.setDest2(dest2);
        poste.setDest3(dest3);
        poste.setDest4(dest4);
        poste.setDest5(dest5);
    
        postmanager.openForWrite();
        long res = postmanager.createPoste(poste);
    
        SparseBooleanArray sp=getListView().getCheckedItemPositions();
    
        String str="";
        for(int j = 0;j<sp.size();j++)
        {
            str+=arrData[sp.keyAt(j)][1]+",";
            check = (CheckBox)findViewById(R.id.check);
            check.setChecked(true);
        }
        Toast.makeText(getApplicationContext(), ""+str, Toast.LENGTH_SHORT).show();
    
        poste2Intent = new Intent(ChoisirContactActivity.this, MainActivity.class);
    
        startActivity(poste2Intent);
    }
    
    // Load data on background
    class LoadContact extends AsyncTask<Void, Void, Void> {
    
        @Override
        protected Void doInBackground(Void... params) {
            // Get Contact list from Phone
    
            if (phones != null) {
                Log.e("count", "" + phones.getCount());
                if (phones.getCount() == 0) {
                    Toast.makeText(ChoisirContactActivity.this, "No contacts in your contact list.", Toast.LENGTH_LONG).show();
                }
    
                while (phones.moveToNext()) {                    
                    String id = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
                    String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                    String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    String EmailAddr = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA2));               
    
                    SelectUser selectUser = new SelectUser();
                    selectUser.setName(name);
                    selectUser.setPhone(phoneNumber);
                    selectUser.setEmail(EmailAddr);
    
                    usermanager.openForWrite();
                    long res = usermanager.createUser(selectUser);
                    selectUsers.add(selectUser);
                }
            } else {
                Log.e("Cursor close 1", "----------------");
            }
            return null;
        }
    
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
    
            final DbHelper myDb = new DbHelper(ChoisirContactActivity.this);
            arrData = myDb.SelectAllDataUser();
    
            listView = getListView();
            adapter = new SelectUserAdapter(ChoisirContactActivity.this, arrData);
            listView.setAdapter(adapter);
    
            listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
            listView.setItemChecked(5, true);
    
            listView.setFastScrollEnabled(true);
    
            // Select item on listclick
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    Log.e("search", "here---------------- listener");
    
                    adapterView.getItemAtPosition(i);
    
                    SelectUser data = selectUsers.get(i);
                    data = usermanager.getUser(data, selectUsers);
                    yuyu = data.getName();
                    Toast.makeText(getApplicationContext(), "Uri:" + yuyu, Toast.LENGTH_LONG).show();
    
                    check = (CheckBox)view.findViewById(R.id.check);
                    check.setChecked(true);
                }
            });
    
            listView.setFastScrollEnabled(true);
        }
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        phones.close();
    }
    
    }

    选择用户管理器

    public class SelectUserManager {
    
    private SelectUser user;
    private DbHelper dbHelper;
    private Cursor cursor;
    private Context context;
    private SQLiteDatabase db;
    private ContentValues contentValues;
    private ArrayList<SelectUser> allUsers;
    int iName, iPhone, iEmail;
    
    private String[] columns = new String[]{DbHelper.KEY_USER,DbHelper.NAME,DbHelper.PHONE,DbHelper.EMAIL};
    
    public SelectUserManager(Context context){
        this.context = context;
        dbHelper = new DbHelper(context);
        contentValues = new ContentValues();
    }
    
    public SelectUserManager openForWrite(){
    
        db = dbHelper.getWritableDatabase();
        return this;
    }
    
    public SelectUserManager openForRead(){
        db = dbHelper.getReadableDatabase();
        return this;
    }
    
    public void close(){
        dbHelper.close();
    }
    
    public long createUser(SelectUser user){
        contentValues.put(DbHelper.NAME, user.getName());
        contentValues.put(DbHelper.PHONE, user.getPhone());
        contentValues.put(DbHelper.EMAIL, user.getEmail());
    
        return db.insert(DbHelper.TABLE_USER, null, contentValues);
    }
    public int updateUser(SelectUser user) {
        String[] whereArgs = {user.getName()};
        openForWrite();
    
        contentValues.put(DbHelper.NAME, user.getName());
        contentValues.put(DbHelper.PHONE, user.getPhone());
        contentValues.put(DbHelper.EMAIL, user.getEmail());
    
        return db.update(DbHelper.TABLE_USER, contentValues, DbHelper.NAME + "= ?", whereArgs);
    }
    
    public int deleteUser(SelectUser user){
        return db.delete(DbHelper.TABLE_USER, DbHelper.NAME + "=" + user.getName(), null);
    }
    
    public ArrayList<SelectUser> getAllUsers(){
        openForRead();
        allUsers = new ArrayList<SelectUser>();
        cursor = db.query(DbHelper.TABLE_USER, columns, null, null, null, null, null, null);
    
        iName = cursor.getColumnIndex(DbHelper.NAME);
        iPhone = cursor.getColumnIndex(DbHelper.PHONE);
        iEmail = cursor.getColumnIndex(DbHelper.EMAIL);
    
        for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()){
            user = new SelectUser(cursor.getString(iName),cursor.getString(iPhone), cursor.getString(iEmail));
            allUsers.add(user);
    
        }
        return allUsers;
    }
    
    public SelectUser getUser(SelectUser user, ArrayList<SelectUser> allUsers){
        openForRead();
        cursor =  db.query(DbHelper.TABLE_USER, columns, null, null, null, null, null);
    
        iName = cursor.getColumnIndex(DbHelper.NAME);
        iPhone = cursor.getColumnIndex(DbHelper.PHONE);
        iEmail = cursor.getColumnIndex(DbHelper.EMAIL);
    
        if(cursor!= null){
            cursor.moveToPosition(allUsers.indexOf(user));
            user = new SelectUser(cursor.getString(iName),cursor.getString(iPhone), cursor.getString(iEmail));
    
        }
        return user;
    }
    }
    
    public类SelectUserManager{
    私人用户;
    私人DbHelper DbHelper;
    私有游标;
    私人语境;
    专用数据库数据库;
    私有内容价值观;
    私人ArrayList诱惑者;
    在我国,iPhone,iEmail;
    私有字符串[]列=新字符串[]{DbHelper.KEY_USER,DbHelper.NAME,DbHelper.PHONE,DbHelper.EMAIL};
    公共SelectUserManager(上下文){
    this.context=上下文;
    dbHelper=新的dbHelper(上下文);
    contentValues=新的contentValues();
    }
    public SelectUserManager openForWrite(){
    db=dbHelper.getWritableDatabase();
    归还这个;
    }
    public SelectUserManager openForRead(){
    db=dbHelper.getReadableDatabase();
    归还这个;
    }
    公众假期结束(){
    dbHelper.close();
    }
    公共长createUser(SelectUser用户){
    contentValues.put(DbHelper.NAME,user.getName());
    contentValues.put(DbHelper.PHONE,user.getPhone());
    contentValues.put(DbHelper.EMAIL,user.getEmail());
    返回db.insert(DbHelper.TABLE_USER,null,contentValues);
    }
    public int updateUser(选择用户){
    字符串[]wherergs={user.getName()};
    openForWrite();
    contentValues.put(DbHelper.NAME,user.getName());
    contentValues.put(DbHelper.PHONE,user.getPhone());
    contentValues.put(DbHelper.EMAIL,user.getEmail());
    返回db.update(DbHelper.TABLE_USER,contentValues,DbHelper.NAME+“=?”,wherergs);
    }
    public int deleteUser(选择用户){
    返回db.delete(DbHelper.TABLE_USER,DbHelper.NAME+“=”+USER.getName(),null);
    }
    公共阵列列表getAllUsers(){
    openForRead();
    allUsers=新的ArrayList();
    cursor=db.query(DbHelper.TABLE_用户,列,null,null,null,null,null,null);
    iName=cursor.getColumnIndex(DbHelper.NAME);
    iPhone=cursor.getColumnIndex(DbHelper.PHONE);
    iEmail=cursor.getColumnIndex(DbHelper.EMAIL);
    对于(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){
    user=newselectuser(cursor.getString(iName)、cursor.getString(iPhone)、cursor.getString(iEmail));
    添加(用户);
    }
    回归诱惑;
    }
    public SelectUser getUser(SelectUser用户、ArrayList allUsers){
    openForRead();
    cursor=db.query(DbHelper.TABLE_用户,列,null,null,null,null);
    iName=cursor.getColumnIndex(DbHelper.NAME);
    iPhone=cursor.getColumnIndex(DbHelper.PHONE);
    iEmail=cursor.getColumnIndex(DbHelper.EMAIL);
    如果(光标!=null){
    cursor.moveToPosition(allUsers.indexOf(user));
    user=newselectuser(cursor.getString(iName)、cursor.getString(iPhone)、cursor.getString(iEmail));
    }
    返回用户;
    }
    }
    
    您正在选中侦听器中的复选框。那是行不通的

    在适配器中,您可以在
    TextView
    中为每个项目显示字符串。您还需要一个布尔数组/列表来跟踪每个项目的复选框状态

  • 在适配器
    getView()
    中,需要获取该位置的选中状态布尔值,然后找到复选框视图并根据布尔值设置复选框状态

  • OnItemClickListener
    中,需要更新该位置的布尔值,并在适配器上调用
    notifyDataSetChanged()

  • public class SelectUserAdapter extends BaseAdapter{
    
        private Context context;
    
        private String[][] lis;
    
        private boolean[] checkedState;
    
        public SelectUserAdapter(Context c, String[][] li) {
    
            context = c;
            lis = li;
            checkedState = new boolean[lis.length];
    
        }
    
        // ...
    
        public View getView(final int position, View convertView, ViewGroup parent) {
    
            if (convertView == null) {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.contact_row, parent, false);
            }
    
            TextView txtName = (TextView) convertView.findViewById(R.id.name);
            txtName.setPadding(10, 0, 0, 0);
            txtName.setText(lis[position][1].toString());
    
            CheckBox cb = (CheckBox) convertView.findViewById(R.id.check);
            cb.setChecked(checkedState[position]);
    
            return convertView;
        }
    
        public void markSelected(int position) {
            checkedState[position] = true;
            notifyDataSetChanged();  // refresh the ListView
        }
    }
    
    我建议您阅读
    ListView
    ,真正了解视图回收时发生的情况,以便了解为什么必须将每个子视图的状态保存在适配器中

    public class SelectUserAdapter extends BaseAdapter{
    
        private Context context;
    
        private String[][] lis;
    
        private boolean[] checkedState;
    
        public SelectUserAdapter(Context c, String[][] li) {
    
            context = c;
            lis = li;
            checkedState = new boolean[lis.length];
    
        }
    
        // ...
    
        public View getView(final int position, View convertView, ViewGroup parent) {
    
            if (convertView == null) {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.contact_row, parent, false);
            }
    
            TextView txtName = (TextView) convertView.findViewById(R.id.name);
            txtName.setPadding(10, 0, 0, 0);
            txtName.setText(lis[position][1].toString());
    
            CheckBox cb = (CheckBox) convertView.findViewById(R.id.check);
            cb.setChecked(checkedState[position]);
    
            return convertView;
        }
    
        public void markSelected(int position) {
            checkedState[position] = true;
            notifyDataSetChanged();  // refresh the ListView
        }
    }
    
    然后在您的活动中:

        // Select item on listclick
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
    
                Log.e("search", "here---------------- listener");
    
                SelectUser data = selectUsers.get(i);
                data = usermanager.getUser(data, selectUsers);
                yuyu = data.getName();
                Toast.makeText(getApplicationContext(), "Uri:" + yuyu, Toast.LENGTH_LONG).show();
    
                SelectUserAdapter adapter = (SelectUserAdapter) adapterView.getAdapter();
                adapter.markSelected(i);
            }
        });
    
    //在列表中选择项单击
    setOnItemClickListener(新的AdapterView.OnItemClickListener(){
    @凌驾
    公共无效onItemClick(AdapterView AdapterView、View视图、int i、long l){
    Log.e(“搜索”,“此处------------------侦听器”);
    SelectUser data=selectUsers.get(i);
    data=usermanager.getUser(数据,选择用户);
    yuyu=data.getName();
    Toast.makeText(getApplicationContext(),“Uri:+yuyu,Toast.LENGTH_LONG).show();
    SelectUserAdapter=(SelectUserAdapter)adapterView.getAdapter();
    适配器。选择标记(i);
    }
    });
    
    您正在选中侦听器中的复选框。那是行不通的

    在适配器中,您可以在
    TextView
    中为每个项目显示字符串。您还需要一个布尔数组/列表来跟踪每个项目的复选框状态

  • 在适配器
    getView()
    中,需要获取该位置的选中状态布尔值,然后找到复选框视图并根据布尔值设置复选框状态

  • OnItemClickListener
    中,需要更新该位置的布尔值,并在适配器上调用
    notifyDataSetChanged()

  • public class SelectUserAdapter extends BaseAdapter{
    
        private Context context;
    
        private String[][] lis;
    
        private boolean[] checkedState;
    
        public SelectUserAdapter(Context c, String[][] li) {
    
            context = c;
            lis = li;
            checkedState = new boolean[lis.length];
    
        }
    
        // ...
    
        public View getView(final int position, View convertView, ViewGroup parent) {
    
            if (convertView == null) {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.contact_row, parent, false);
            }
    
            TextView txtName = (TextView) convertView.findViewById(R.id.name);
            txtName.setPadding(10, 0, 0, 0);
            txtName.setText(lis[position][1].toString());
    
            CheckBox cb = (CheckBox) convertView.findViewById(R.id.check);
            cb.setChecked(checkedState[position]);
    
            return convertView;
        }
    
        public void markSelected(int position) {
            checkedState[position] = true;
            notifyDataSetChanged();  // refresh the ListView
        }
    }
    
    我建议您阅读
    ListView
    ,真正了解视图回收时发生的情况,以便了解为什么必须将每个子视图的状态保存在适配器中

    public class SelectUserAdapter extends BaseAdapter{
    
        private Context context;
    
        private String[][] lis;
    
        private boolean[] checkedState;
    
        public SelectUserAdapter(Context c, String[][] li) {
    
            context = c;
            lis = li;
            checkedState = new boolean[lis.length];
    
        }
    
        // ...
    
        public View getView(final int position, View convertView, ViewGroup parent) {
    
            if (convertView == null) {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.contact_row, parent, false);
            }
    
            TextView txtName = (TextView) convertView.findViewById(R.id.name);
            txtName.setPadding(10, 0, 0, 0);
            txtName.setText(lis[position][1].toString());
    
            CheckBox cb = (CheckBox) convertView.findViewById(R.id.check);
            cb.setChecked(checkedState[position]);
    
            return convertView;
        }
    
        public void markSelected(int position) {
            checkedState[position] = true;
            notifyDataSetChanged();  // refresh the ListView
        }
    }
    
    然后在您的活动中:

        // Select item on listclick
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
    
                Log.e("search", "here---------------- listener");
    
                SelectUser data = selectUsers.get(i);
                data = usermanager.getUser(data, selectUsers);
                yuyu = data.getName();
                Toast.makeText(getApplicationContext(), "Uri:" + yuyu, Toast.LENGTH_LONG).show();
    
                SelectUserAdapter adapter = (SelectUserAdapter) adapterView.getAdapter();
                adapter.markSelected(i);
            }
        });
    
    //在列表中选择项单击
    setOnItemClickListener(新的AdapterView.OnItemClickListener(){
    @凌驾
    公共无效onItemClick(AdapterView AdapterView、View视图、int i、long l){
    Log.e(“搜索”,“此处------------------侦听器”);
    SelectUser data=selectUsers.get(i);
    data=usermanager.getUser(数据,选择用户);
    yuyu=data.getName();
    到