如何在listview android中创建变量numer元素

如何在listview android中创建变量numer元素,android,listview,Android,Listview,我正在尝试制作一个列表视图,其中显示一个带有可变数量复选框的问题。我正在使用一个扩展BaseAdapter的类。我的问题出现在列表需要滚动然后重复行的时候。我知道我的错误在哪里,但我找不到解决办法。我需要从metod getView中提取部分代码,就像我在问题标题中所做的那样,但我无法完成其余部分,请帮助 private class AdaptadorListaPreguntas extends BaseAdapter{ ArrayList<String> array;

我正在尝试制作一个列表视图,其中显示一个带有可变数量复选框的问题。我正在使用一个扩展BaseAdapter的类。我的问题出现在列表需要滚动然后重复行的时候。我知道我的错误在哪里,但我找不到解决办法。我需要从metod getView中提取部分代码,就像我在问题标题中所做的那样,但我无法完成其余部分,请帮助

private class AdaptadorListaPreguntas extends BaseAdapter{

    ArrayList<String> array;
    public AdaptadorListaPreguntas(ArrayList<String> lista){
        array=lista;
    }
    @Override
    public int getCount() {
        return array.size();
    }

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        HolderListaPreguntas holder;
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        String frase = array.get(position);
        if (convertView == null)
        {

            holder = new HolderListaPreguntas();

            convertView = inflater.inflate(R.layout.lista_multiple_eleccion, parent, false);
            convertView.setTag(holder);

            //Count how many checkbox i need
            for (int i=0 ; i<frase.length(); i++){
                if (frase.charAt(i) == '\n'){
                    nCheckBox++;
                }
            }
            //Rest one, need for the format of the string
            nCheckBox--;

            for(int i=0; i<nCheckBox; i++){

                CheckBox cb = new CheckBox(getApplicationContext(),null,android.R.attr.checkboxStyle);

                cb.setTextColor(Color.BLACK);
                cb.setButtonDrawable(R.drawable.checkbox_multiple_eleccion);

                //Put checkbox in to layout
                holder.layout = (LinearLayout) convertView.findViewById(R.id.checkboxmultiple);
                holder.layout.addView(cb);
            }

            //reset for next loop
            nCheckBox = 0;
        }

        else{
            holder = (HolderListaPreguntas) convertView.getTag();
        }

        holder.tituloPregunta = (TextView) convertView.findViewById(R.id.titulopreguntamultple);
        holder.id = position;
        holder.layout = (LinearLayout) convertView.findViewById(R.id.checkboxmultiple);


        //Get text for each CheckBox
        int indice = frase.indexOf("-");
        String titulo = frase.substring(frase.indexOf(")")+1, frase.indexOf("-", indice+1));
        holder.tituloPregunta.setText(titulo);

        //Put all elements of layout in array
        ArrayList<View> respuestas = holder.layout.getTouchables();

      //Format of the text (only need "question") -Question;/;(id:n)(vof)
        int indPriPreInit = frase.indexOf("-", frase.indexOf("-")+1);
        int indPriPreFin= frase.indexOf(";/;");

        //put text in the checkbox
        for (View cb : respuestas){
            if(cb instanceof CheckBox){

                indPriPreInit = frase.indexOf("-", indPriPreInit);
                indPriPreFin = frase.indexOf(";/;", indPriPreFin);

                if (indPriPreInit > -1 && indPriPreFin > -1){
                    String textoCheckBox = (String) frase.subSequence(indPriPreInit, indPriPreFin);
                    indPriPreInit = indPriPreInit+1;
                    indPriPreFin = indPriPreFin+1;
                    //Relleno el texto del checkbox
                    ((CheckBox) cb).setText(textoCheckBox);
                }
            }
        }

        return convertView;
    }

}
私有类适配器ListaPreguntas扩展BaseAdapter{
数组列表数组;
公共适配器列表(ArrayList lista){
数组=lista;
}
@凌驾
public int getCount(){
返回array.size();
}
@凌驾
公共对象getItem(int位置){
返回数组.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
持票人作为持票人;
LayoutFlater充气器=(LayoutFlater)getSystemService(Context.LAYOUT\u充气器\u服务);
String frase=array.get(位置);
if(convertView==null)
{
支架=新支架支架支架支架();
convertView=充气机。充气(R.layout.lista\u多重电气,父项,false);
convertView.setTag(支架);
//数一数我需要多少个复选框
对于(int i=0;i-1){
字符串textoCheckBox=(字符串)frase.subSequence(indPriPreInit,indPriPreFin);
INDPRIINIT=INDPRIINIT+1;
indPriPreFin=indPriPreFin+1;
//Relleno el texto del复选框
((复选框)cb.setText(textoCheckBox);
}
}
}
返回视图;
}
}
公共类AdapterListApreguntas扩展BaseAdapter实现CompoundButton.OnCheckedChangeListener{
私有最终数组列表数组;
检查私人最终名单;
公共适配器列表(ArrayList lista){
数组=lista;
选中=新的ArrayList(lista.size());
}
@凌驾
public int getCount(){
返回array.size();
}
@凌驾
公共对象getItem(int位置){
返回数组.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
持票人作为持票人;
LayoutFlater充气器=(LayoutFlater)getSystemService(Context.LAYOUT\u充气器\u服务);
String frase=array.get(位置);
int checkboxCount=frase.split(“\n”).length-1;
if(convertView==null){
支架=新支架支架支架支架();
convertView=充气机。充气(R.layout.lista\u多重电气,父项,false);
holder.layout=(LinearLayout)convertView.findViewById(R.id.checkboxmultiple);
convertView.setTag(支架);
}
否则{
holder=(holderListPreguntas)convertView.getTag();
}
设定电流;
试一试{
当前=选中。获取(位置);
}捕获(NullPointerException e){
当前=新哈希集(checkboxCount);
选中。设置(位置、电流);
}
List respuestas=新阵列列表(checkboxCount);
holder.layout.removeallview();
对于(int i=0;i-1&&indPriPreFin>-1){
字符串textoCheckBox=(字符串)frase.subSequence(indPriPreInit,indPriPreFin);
INDPRIINIT=INDPRIINIT+1;
indPriPreFin=indPriPreFin+1;
//Relleno el texto del复选框
cb.setText(textoCheckBox);
}
}
返回视图;
}
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
int position=(整数)按钮view.getTag();
ViewGroup vg=(ViewGroup)按钮View.getParent();
List touchables=vg.getTouchables();
int index=touchables.indexOf(按钮视图);
如果(已检查){
选中。获取(位置)。添加(索引);
}否则{
选中。获取(位置)。删除(索引);
}
}
}

最后,我决定使用scrollView代替listView,原因是listView使用了我不想使用的回收系统,这就是问题所在

我在中找到了有关如何使用ListView的更多信息:


谢谢大家的帮助。

我现在没有时间阅读代码,但您必须做的是:{loop-add question{loop-add复选框
public class AdaptadorListaPreguntas extends BaseAdapter implements CompoundButton.OnCheckedChangeListener {

    private final ArrayList<String> array;
    private final List<Set<Integer>> checked;

    public AdaptadorListaPreguntas(ArrayList<String> lista){
        array=lista;
        checked = new ArrayList<Set<Integer>>(lista.size());
    }
    @Override
    public int getCount() {
        return array.size();
    }

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        HolderListaPreguntas holder;
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        String frase = array.get(position);
        int checkboxCount = frase.split("\n").length-1;
        if (convertView == null) {
            holder = new HolderListaPreguntas();
            convertView = inflater.inflate(R.layout.lista_multiple_eleccion, parent, false);
            holder.layout = (LinearLayout) convertView.findViewById(R.id.checkboxmultiple);
            convertView.setTag(holder);
        }
        else{
            holder = (HolderListaPreguntas) convertView.getTag();
        }


        Set<Integer> current;
        try {
          current = checked.get(position);
        } catch(NullPointerException e) {
            current = new HashSet<Integer>(checkboxCount);
            checked.set(position, current);
        }

        List<CheckBox> respuestas = new ArrayList<CheckBox>(checkboxCount);
        holder.layout.removeAllViews();

        for(int i=0; i < checkboxCount; i++) {
            CheckBox cb = new CheckBox(getApplicationContext(),null,android.R.attr.checkboxStyle);
            cb.setTextColor(Color.BLACK);
            cb.setButtonDrawable(R.drawable.checkbox_multiple_eleccion);
            respuestas.add(cb);
            cb.setTag(position);
            if (current.contains(position))
                cb.setChecked(true);
            holder.layout.addView(cb);
        }

        holder.tituloPregunta = (TextView) convertView.findViewById(R.id.titulopreguntamultple);
        holder.id = position;
        holder.layout = (LinearLayout) convertView.findViewById(R.id.checkboxmultiple);


        //Get text for each CheckBox
        int indice = frase.indexOf("-");
        String titulo = frase.substring(frase.indexOf(")")+1, frase.indexOf("-", indice+1));
        holder.tituloPregunta.setText(titulo);

        //Format of the text (only need "question") -Question;/;(id:n)(vof)
        int indPriPreInit = frase.indexOf("-", frase.indexOf("-")+1);
        int indPriPreFin= frase.indexOf(";/;");

        //put text in the checkbox
        for (CheckBox cb : respuestas){
            indPriPreInit = frase.indexOf("-", indPriPreInit);
            indPriPreFin = frase.indexOf(";/;", indPriPreFin);

            if (indPriPreInit > -1 && indPriPreFin > -1){
                String textoCheckBox = (String) frase.subSequence(indPriPreInit, indPriPreFin);
                indPriPreInit = indPriPreInit+1;
                indPriPreFin = indPriPreFin+1;
                //Relleno el texto del checkbox
                cb.setText(textoCheckBox);
            }
        }

        return convertView;
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        int position = (Integer)buttonView.getTag();
        ViewGroup vg = (ViewGroup)buttonView.getParent();
        List<View> touchables = vg.getTouchables();
        int index = touchables.indexOf(buttonView);
        if (isChecked) {
            checked.get(position).add(index);
        } else {
            checked.get(position).remove(index);
        }
    }
}