我一直在寻找解决我问题的方法但是找不到一个就这样了。
我有一个数据的arraylist,我使用textview和checkbox的组合显示。这是使用自定义适配器完成的,它基本上是逐行膨胀。到目前为止,一切都很好,直到我想要检索已检查的数据。
我从其他人那里读到的是,由于视图的回收,滚动时他们的复选框变为未选中状态。 对我来说,复选框的状态仍为,但我不知道如何在不滚动的情况下退出它们。当我选中一个方框时,它在UI上“检查”,但是直到我将选中的项目滚出视图并再次返回时才会识别它。
目前,如果list.get(position).isSelected()== true,我使用全局arraylist填充list.get(position).getName()。但是你看到这个arraylist仍然是空的,除非我将项目滚出视图并再次返回。同样适用于未选中框时,它们会保留在arraylist中直到我滚动。我想到的是一个提交按钮,当单击它时,它会获取所有复选框的当前状态,然后构建arraylist。
任何想法如何创造这样的东西?
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;
}
}
答案 0 :(得分:1)
我已经搞砸了类似的问题。您最初可以在构造函数中调用一个函数,该函数将复选框的状态初始化为false并保存arraylist中的所有状态。只要单击复选框,只需选中该框并将其状态保存在布尔arraylist中。 稍后您可以从arraylist中检索您的状态。 如果你不明白,请告诉我,我会尝试发送一些代码来帮助你......
以下是一些帮助您的代码: 我将创建一个布尔arraylist。
private ArrayList<Boolean> itemChecked = null;
然后我将在构造函数中将所有复选框的状态设置为false:
for (int i=0; i < no_of_elements.size(); i++) {
itemChecked.add(i, false);
}
单击复选框时设置实际检查状态:
holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
itemChecked.set(position, isChecked);
}
});