1

我四处寻找解决我的问题的方法,但找不到,所以就在这里。

我有一个使用 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;
}

}

4

1 回答 1

1

我已经搞砸了类似的问题。您最初可以在构造函数中调用一个函数,该函数将复选框的状态初始化为 false,并将所有状态保存在数组列表中。每当单击复选框时,只需选中该框并将其状态保存在布尔数组列表中。稍后您可以从 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);

            }
        });
于 2012-04-17T12:35:36.950 回答