复选框:项目选择-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();
到