Java 线性布局中复选框的最佳解决方案

Java 线性布局中复选框的最佳解决方案,java,android,xml,checkbox,Java,Android,Xml,Checkbox,在我的LinearLayout中,有数量可变的复选框。在我一个月前的一个问题中,有人说最好动态添加复选框,而不是让它们不可见 Integer[] count = new Integer[]{1,2,3,4,5,6,7,8,9,10}; size = mFrageList.get(position).getAuswahlList().size(); for (int i = 0; i < size; i++) { cBox = new CheckBox(this); cBo

在我的LinearLayout中,有数量可变的复选框。在我一个月前的一个问题中,有人说最好动态添加复选框,而不是让它们不可见

Integer[] count = new Integer[]{1,2,3,4,5,6,7,8,9,10};
size = mFrageList.get(position).getAuswahlList().size();
for (int i = 0; i < size; i++) {

    cBox = new CheckBox(this);
    cBox.setText(mFrageList.get(position).getAuswahlList().get(i));
    cBox.setId(count[i]);
    cBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

           if(isChecked){
                antwortencode[position] += "" + buttonView.getId();
                frageBeantworten.setText("Antwort :"+antwortencode[position]+" abgeben");

            } else {
                 String id = Integer.toString(buttonView.getId());
                 antwortencode[position] = antwortencode[position].replaceAll(id,"");
                 if(!antwortencode[position].isEmpty() || antwortencode[position]!= "") {
                     frageBeantworten.setText("Antwort :" + antwortencode[position] + " abgeben");
                  } else {
                      frageBeantworten.setText("Keine Checkbox(en) gewählt");
                  }
           }
       }
});

antworten.addView(cBox);
Integer[]count=新整数[]{1,2,3,4,5,6,7,8,9,10};
size=mFrageList.get(position.getAuswahlList().size();
对于(int i=0;i
目前,我可以使用复选框保存字符串,若我取消选中复选框,它会从字符串中删除它的值。 如果我更新活动,字符串将被保存,复选框将从mFrageList.get(position)getAuswahlList()中获取一个新列表;并在“antwortencode”列表中填充一个新字符串及其值

如果我返回到上一个位置,我有生成的字符串,但是复选框不再被选中。但是它们有来自旧位置的字符串。这意味着除了复选框的状态之外,所有内容都被保存。我无法设置cBox.setChecked(isChecked)或buttonView.setChecked(isChecked)或buttonView.setChecked(buttonView.isChecked())或语法几乎相同的东西

我不知道除了在一个xml文件中声明10个复选框以逐个与它们对话,并在auswahlist.get(position.isEmpty()中设置VISIBLE.false之外还能做什么


重要提示:我的XML是一个可滚动的活动,因为内容的大小超出了屏幕的范围。这就是为什么我没有也不能使用列表视图。因此我需要一个使用线性布局的解决方案。事实上,你应该实际使用一个
列表视图。只要你多次重复使用一个布局,就可以这样做

有两种选择:

  • ListView作为根目录-将布局的其他内容添加为不同类型的视图

  • 可滚动布局内的ListView-ListView有许多轻量级实现,允许它包装内容,例如

另一件事是如何维护复选框的状态-使用模型类。ListView非常简单,因为它强制您使用
适配器
,该适配器提供了迭代所有位置的方法

适配器示例:

public class CheckableItemAdapter extends BaseAdapter {

private List<Pair<Integer, Boolean>> items = new ArrayList<>();

public void setItems(List<Pair<Integer, Boolean>> items) {
    this.items = items;
}

@Override
public int getCount() {
    return items.size();
}

@Override
public Object getItem(int position) {
    return items.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view;
    ViewHolder holder;
    if (convertView == null) {
        view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_checkable, parent, false);
        holder = new ViewHolder(view);
        view.setTag(holder);
    } else {
        view = convertView;
        holder = (ViewHolder) view.getTag();
    }
    Pair<Integer, Boolean> item = items.get(position);
    holder.itemCheck.setChecked(item.second);
    return view;
}

static class ViewHolder {

    CheckBox itemCheck;

    public ViewHolder(View itemView) {
        itemCheck = (CheckBox) itemView.findViewById(R.id.check);
    }
}
}
公共类CheckableItemAdapter扩展了BaseAdapter{
私有列表项=新的ArrayList();
公共无效集合项(列表项){
这个项目=项目;
}
@凌驾
public int getCount(){
返回items.size();
}
@凌驾
公共对象getItem(int位置){
返回项目。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图;
视窗座;
if(convertView==null){
view=LayoutInflater.from(parent.getContext()).flate(R.layout.item_checkeble,parent,false);
支架=新的视图支架(视图);
视图.设置标签(支架);
}否则{
视图=转换视图;
holder=(ViewHolder)view.getTag();
}
Pair item=items.get(位置);
holder.itemCheck.setChecked(item.second);
返回视图;
}
静态类视窗夹{
复选框项检查;
公共视图持有者(视图项视图){
itemCheck=(复选框)itemviewbyd(R.id.check);
}
}
}

我已经设法独自解决了我的问题,现在我想分享它,即使它不是最好的编程示例

  Integer[] count = new Integer[]{1,2,3,4,5,6,7,8,9,10}; //maximum of 10 Checkboxes
        size = mFrageList.get(position).getAuswahlList().size();
        for (int i = 0; i < size; i++) {
            cBox = new CheckBox(this);
            cBox.setText(mFrageList.get(position).getAuswahlList().get(i));
            cBox.setId(count[i]);

            try{ //this is where the magic happens
                if(antwortencode[position] != ""){ //cause i won´t want null in my db i´ve set "" as standard string in my activity for the List<String>
                    String code = antwortencode[position];
                    char[] c = code.toCharArray();
                    for(int j=0;j<=c.length;j++){
                        int x = c[j] -'0'; // 'char 1' - 'char 0' = Integer 1 , lol
                        if(cBox.getId()== x){ //compare them
                            cBox.toggle(); //if it fits, toggle
                        }
                    }
                }
            } catch (Exception e){
                    e.printStackTrace();
            } //and here it ends

            cBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    if(isChecked){
                        antwortencode[position] += "" + buttonView.getId();
                        frageBeantworten.setText("Antwort :"+antwortencode[position]+" abgeben");

                    } else {
                        String id = Integer.toString(buttonView.getId());
                        antwortencode[position] = antwortencode[position].replaceAll(id,"");
                        if(!antwortencode[position].isEmpty() || antwortencode[position]!= "") {
                            frageBeantworten.setText("Antwort :" + antwortencode[position] + " abgeben");
                        } else {
                            frageBeantworten.setText("Keine Checkbox(en) gewählt");
                        }
                    }
                }
            });

            antworten.addView(cBox);
Integer[]count=新整数[]{1,2,3,4,5,6,7,8,9,10};//最多10个复选框
size=mFrageList.get(position.getAuswahlList().size();
对于(int i=0;i对于(int j=0;开玩笑,但我不能使用Listview,因为它会干扰我的ScrollableActivity并反转。而且不可能在一个活动中同时使用它们。就我在stackoverflow中读到的关于这个问题的主题而言。但我设法独自解决了我的问题。编程8个小时后,我的头和手指开始胡闹。