【发布时间】:2014-01-23 09:18:55
【问题描述】:
我知道这个问题有很多解决方案,但是当检查复选框时,我不是正确的解决方案,我正在为它分配一个身份证,并将其添加到数组,但滚动下来,复选框未选中,但 ID 存储在数组中,如果选中,我想保持复选框处于选中状态。
我的适配器类是。
public class sendivitesadapter extends ArrayAdapter<Item> implements Filterable,SectionIndexer{
private Context context;
private ArrayList<Item> items;
private qrusers qrusers;
private LayoutInflater vi;
private String[] udis;
private final boolean[] mCheckedState;
qrusers qrus;
private ItemsFilter mFilter;
public sendivitesadapter(Context context,ArrayList<Item> items,String[]udis) {
super(context, 0,items);
this.context = context;
mCheckedState = new boolean[items.size()];
this.qrusers =(qrusers) context;
this.items = items;
this.udis=uid;
vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return items.size();
}
@Override
public Item getItem(int position) {
return super.getItem(position);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View v = convertView;
final Item i = items.get(position);
if (i != null) {
if(i.isSection()){
SectionItem si = (SectionItem)i;
v = vi.inflate(R.layout.checkboxlist, null);
v.setOnClickListener(null);
v.setOnLongClickListener(null);
v.setLongClickable(false);
final TextView sectionView = (TextView) v.findViewById(R.id.list_item_section_text);
sectionView.setText(si.getTitle());
}else{
sendItem ei = (sendItem)i;
v = vi.inflate(R.layout.checkboxlist, null);
final TextView title = (TextView)v.findViewById(R.id.contactname);
final TextView subtitle = (TextView)v.findViewById(R.id.companyname);
checkBox=(CheckBox)v.findViewById(R.id.checboxlist);
//checkBox.setTag(position);
//items.addAll(uid);
checkBox.setTag(udis[position]);
checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
s = (String)buttonView.getTag();
Log.e("IDDDDDDDD", s);
userid.add(s);
Log.e("Array", userid.toString());
} else {
s = (String)buttonView.getTag();
userid.remove(s);
}
SharedPreferences app_preferences = PreferenceManager
.getDefaultSharedPreferences(qrusers.this);
SharedPreferences.Editor editor = app_preferences.edit();
editor.putString("userid", TextUtils.join(",", userid));
editor.commit();
}
});
// Log.e("IDDDDDDD", text);
//checkBox.setTag("12");
/* checkBox.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(checkBox.isChecked()){
s= (String)v.getTag();
Log.e("IDDDDDDDDDDDDDDDDDDDDDD", s);
userid.add(s);
Log.e("Array", userid.toString());
}
else{
s=(String)v.getTag();
userid.remove(s);
}
}
});*/
if (title != null)
title.setText(ei.contactname);
if(subtitle != null)
subtitle.setText(ei.companyname);
}
}
return v;
}
【问题讨论】:
-
取一个静态散列映射来放置您的列表视图位置和布尔值,因此当您第一次调用适配器时,您会将所有位置设置为 false。之后,当您选择任何复选框时,您将设置该位置布尔值为真,所以当你向下滚动时它也不会做任何改变,因为我们正在采用静态哈希图
-
首先使用 BaseAdapter 而不是 ArrayAdapter & 在适配器的 getView 方法中保存复选框的检查状态。