在我全部检查后,我有一些问题取消选中复选框。
这里您简要概述了我的代码。
我在这个适配器中用一个名为“MyAdapter”的自定义适配器填充一个列表项,我使用:
1)一个布尔数组来保存女巫复选框是checket and witch not
2) “用户”的ArrayList,其中User是包含许多信息的类,如电话号码和联系人姓名.3)我只添加用户选中的ArrayList。
问题是:如果我手动选中所有复选框然后取消选中一些,则一切正常。但如果我使用checkAll()方法,我会很快给你看,然后手动取消选中一些,它只能以图形方式工作(复选框未选中) ),但用户未选中状态不会从对应的数组列表中删除。
这是我的代码,任何后悔都将受到赞赏:
public class MyAdapter extends ArrayAdapter<User> {
private boolean[] checkList;
private ArrayList<User> checkedUsersList;
private LinkedList<User> originalList;
private int listSize;
private Context mContext;
public MyAdapter(Context context,int textViewResourceId,
List<User> objects) {
super(context,textViewResourceId, objects);
mContext = context;
checkedUsersList = new ArrayList<User>();
originalList = (LinkedList<User>) objects;
checkList = new boolean[objects.size()];
listSize = objects.size();
for(int i=0;i<objects.size();i++)
{
checkList[i] = false;
}
// TODO Auto-generated constructor stub
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getViewOptimize(position, convertView, parent);
}
public View getViewOptimize(int position, View convertView, ViewGroup parent) {
final int pos = position;
ViewHolder viewHolder = null;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.rowcustom, null);
viewHolder = new ViewHolder();
viewHolder.name = (TextView)convertView.findViewById(R.id.textViewName);
viewHolder.number = (TextView)convertView.findViewById(R.id.textViewNumber);
viewHolder.checkBox = (CheckBox)convertView.findViewById(R.id.checkBoxUserLine);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
final User utente = getItem(position);
viewHolder.name.setText(utente.getContactName());
viewHolder.number.setText(utente.getContactNumber());
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked)
{
Toast toast = Toast.makeText(mContext, "Check true notified", 1500);
toast.show();
if(!checkedUsersList.contains(utente))
checkedUsersList.add(utente);
}
else
{
Toast toast = Toast.makeText(mContext, "Check false notified", 1500);
toast.show();
checkedUsersList.remove(utente);
}
checkList[pos] = isChecked;
}
});
viewHolder.checkBox.setChecked(checkList[pos]);
return convertView;
}
public ArrayList<User> getUsersChecked()
{
return checkedUsersList;
}
public void checkAll()
{
for(int i = 0; i<listSize;i++)
{
checkList[i] = true;
}
checkedUsersList.clear();
for(User us : originalList)
{
checkedUsersList.add(new User(us.getContactName(), us.getContactNumber()));
}
notifyDataSetChanged();
}
private class ViewHolder {
public TextView name;
public TextView number;
public CheckBox checkBox;
}
}
答案 0 :(得分:1)
for(User us : originalList)
{
checkedUsersList.add(new User(us.getContactName(), us.getContactNumber()));
}
将us
添加到列表中,而不是新的user
。
答案 1 :(得分:1)
在checkAll中将所有用户添加到列表中时,您正在创建新用户:
for(User us : originalList)
{
checkedUsersList.add(new User(us.getContactName(), us.getContactNumber()));
}
替换为
for(User us : originalList)
{
checkedUsersList.add(us);
}
这是解决方案。问题是您正在将原始对象与checkedUsersList.contains(utente)中对象的副本进行比较
答案 2 :(得分:0)
通过创建一个布尔数组来保持列表复选框的状态。