【问题标题】:CheckBox: item selection - ANDROIDCheckBox:项目选择 - ANDROID
【发布时间】:2015-11-26 01:29:26
【问题描述】:

当我检查CheckBox 中的项目时,也会检查其他项目。 我的应用程序有一个ListView 的联系人姓名和CheckBox。另外,用户可以多选列表中的名字。

我有 3 节课

  1. 公共类 ChoisirContactActivity
  2. 公共类 SelectUserAdapter
  3. 公共类 SelectUserManager

感谢您的帮助。

ChoisirContactActivity

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 SelectUserAdapter extends BaseAdapter{

private Context context;

private String[][] lis;

public SelectUserAdapter(Context c, String[][] li) {
    context = c;
    lis = li;
}

public int getCount() {
    if(lis != null) {
        return lis.length;
    }else{
        return 0;
    }
}

//  @Override
public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}


private class ViewHolder {
    TextView name;
    CheckBox box;
}


public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    Log.v("ConvertView", String.valueOf(position));

    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.contact_row, null);          
    }  

    TextView txtName = (TextView) convertView.findViewById(R.id.name);
    txtName.setPadding(10, 0, 0, 0);
    txtName.setText(lis[position][1].toString());

    return convertView;
}

}

选择用户管理器

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

【问题讨论】:

    标签: android listview checkbox baseadapter


    【解决方案1】:

    您正在检查 OnItemClickListener 中的复选框。那是行不通的。

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

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

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

    我建议您阅读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);
            }
        });
    

    【讨论】:

    • 太棒了!如果您能将答案标记为正确,我将不胜感激。
    • 嗨,我使用的是相同的代码。它通常应该只显示我选择的项目,但每次我尝试时,它都会显示另一个我没有选择的项目,这个未选择的项目总是相同的。关于我做错了什么的任何建议?非常感谢你
    • 这里是 ChoisirContactActivity 中代码的相关部分: SparseBooleanArray sp=getListView().getCheckedItemPositions();字符串 str=""; for(int j = 0;j
    • 对不起,我不知道如何标记答案,我是这个神奇网站的新手
    猜你喜欢
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2011-03-04
    • 2015-01-16
    相关资源
    最近更新 更多