我四处寻找解决我的问题的方法,但找不到,所以就在这里。
我有一个使用 textview 和复选框组合显示的数据数组列表。这是使用自定义适配器完成的,该适配器基本上逐行膨胀。到目前为止一切都很好,直到我想检索检查的数据。
我从其他人那里了解到,由于视图的回收,他们的选中框在滚动时变为未选中状态。对我来说,复选框的状态仍然存在,但我不知道如何在不滚动的情况下取消它们。当我选中一个框时,它是 UI 上的“选中”,但实际上直到我将选中的项目滚动出视图并再次返回时,它才会被识别。
目前,如果 list.get(position).isSelected() == true,我使用全局数组列表填充 list.get(position).getName()。但是你会看到这个数组列表仍然是空的,除非我将项目滚动出视图并再次返回。当未选中这些框时,这同样适用,它们保留在数组列表中,直到我滚动。我想到的是一个提交按钮,它在单击它时获取所有复选框的当前状态,然后构造数组列表。
知道如何创建这样的东西吗?
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
if (convertView == null) {
LayoutInflater inflator = context.getLayoutInflater();
view = inflator.inflate(R.layout.qlist, null);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) view.findViewById(R.id.label);
viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);
viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Model element = (Model) viewHolder.checkbox.getTag();
//
if(isChecked){
selctionCount++;
}
else if (!isChecked){
selctionCount--;
}
if(selctionCount > 2)
{
Toast.makeText(context, "error, you checked more than 2!", Toast.LENGTH_LONG).show();
element.setSelected(false);
}
else
{
element.setSelected(buttonView.isChecked());
}
System.out.println(selctionCount);
}
});
view.setTag(viewHolder);
viewHolder.checkbox.setTag(list.get(position));
}
else {
view = convertView;
((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.text.setText(list.get(position).getName());
//This is the problem here! the selected arraylist (global) is empty even when i check the boxes,
//it only populates when i scroll the checked boxes out of view and back in! helphelp!
holder.checkbox.setChecked(list.get(position).isSelected());
if (list.get(position).isSelected() == true){
selected.add(list.get(position).getName());
}
else if (list.get(position).isSelected() == false){
selected.remove(list.get(position).getName());
}
return view;
}
}