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