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



在我的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);

目前,我可以保存带有选中复选框的字符串,如果我取消选中复选框,它会将其值从字符串中删除。 如果我更新活动,字符串将被保存,并且复选框从 mFrageList.get(position)getAuswahlList();并在"antwortencode"列表中用他们的值填充一个新字符串。

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

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

重要说明:我的 XML 是可滚动活动,因为内容的大小过度扩展了屏幕。这就是为什么我没有也不能使用列表视图。所以我需要一个使用线性布局的解决方案

事实是,您实际上应该使用ListView。只要您多次重复使用布局 - 就这样做。

有 2 个选项:

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

  • 可滚动布局中的ListView - ListView有许多轻量级的实现,允许它包装内容,例如 https://github.com/paolorotolo/ExpandableHeightListView

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

适配器示例:

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);
}
}
}

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

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);

Ty的答案和对我问题的纠正。 Nostramärus

最新更新