android – 滚动我的自定义ListView时,Checkbox丢失了检查值

android – 滚动我的自定义ListView时,Checkbox丢失了检查值,第1张

概述我拥有:带有Textviews和复选框的自定义列表视图. 问题:如果我检查屏幕上显示的初始项目然后滚动列表,当我返回列表顶部(向上滚动)时,它们的值被正确保存.但是,如果我滚动列表,例如我想检查列表中的最后一个树复选框,那么如果我上下滚动它们就会被取消选中….为什么?** 我在其他论坛上看到了同样问题的各种解决方案,也在stackoverflow上,但问题仍然存在. 在我的getView函数下面, 我拥有:带有TextvIEws和复选框的自定义列表视图.
问题:如果我检查屏幕上显示的初始项目然后滚动列表,当我返回列表顶部(向上滚动)时,它们的值被正确保存.但是,如果我滚动列表,例如我想检查列表中的最后一个树复选框,那么如果我上下滚动它们就会被取消选中….为什么?**

我在其他论坛上看到了同样问题的各种解决方案,也在stackoverflow上,但问题仍然存在.
在我的getVIEw函数下面,我认为是可以的:

@OverrIDe      public VIEw getVIEw(final int position,VIEw convertVIEw,VIEwGroup parent) {    final VIEwHolder vIEwHolder;    if (convertVIEw == null) {        convertVIEw = mInflater.inflate(R.layout.item_select_frIEnds,null);        vIEwHolder=new VIEwHolder();        vIEwHolder.nameText=(TextVIEw) convertVIEw.findVIEwByID(R.ID.personname);        vIEwHolder.surnameText=(TextVIEw) convertVIEw.findVIEwByID(R.ID.personSurname);        vIEwHolder.contactimage=(ImageVIEw) convertVIEw.findVIEwByID(R.ID.personImage);        vIEwHolder.checkBox=(CheckBox)convertVIEw.findVIEwByID(R.ID.checkBox);        convertVIEw.setTag(vIEwHolder);        vIEwHolder.nameText.setTag(vIEwHolder.nameText);        vIEwHolder.nameText.setTag(vIEwHolder.surnameText);        vIEwHolder.contactimage.setTag(data[position]);        vIEwHolder.checkBox.setChecked(data[position].isCheck());          vIEwHolder.checkBox.setonClickListener(new OnClickListener() {              public voID onClick(VIEw arg0) {                  if(vIEwHolder.checkBox.isChecked()==true)                       data[position].setCheck(true);                  else                      data[position].setCheck(false);              }          });    }    else{        vIEwHolder = (VIEwHolder) convertVIEw.getTag();    }    vIEwHolder.nameText.setText(data[position].getname());    vIEwHolder.surnameText.setText(data[position].getSurname());    vIEwHolder.contactimage.setimageResource(data[position].getPhotoRes());    vIEwHolder.contactimage.setScaleType(ScaleType.FIT_XY);    vIEwHolder.checkBox.setChecked(data[position].isCheck());    return convertVIEw;}

解决:我解决了我的问题getVIEw whit这段代码:

public class NewQAAdapterSelectFrIEnds extends BaseAdapter {private LayoutInflater mInflater;private Person[] data;boolean[] checkBoxState;VIEwHolder vIEwHolder;public NewQAAdapterSelectFrIEnds(Context context) {     mInflater = LayoutInflater.from(context);}public voID setData(Person[] data) {    this.data = data;    checkBoxState=new boolean[data.length];}@OverrIDepublic int getCount() {    return data.length;}@OverrIDepublic Object getItem(int item) {    return data[item];}@OverrIDepublic long getItemID(int position) {    return position;}@OverrIDepublic VIEw getVIEw(final int position,VIEwGroup parent) {    if (convertVIEw == null) {        convertVIEw = mInflater.inflate(R.layout.item_select_frIEnds,null);        vIEwHolder=new VIEwHolder();        vIEwHolder.nameText=(TextVIEw) convertVIEw.findVIEwByID(R.ID.personname);        vIEwHolder.surnameText=(TextVIEw) convertVIEw.findVIEwByID(R.ID.personSurname);        vIEwHolder.contactimage=(ImageVIEw) convertVIEw.findVIEwByID(R.ID.personImage);        vIEwHolder.checkBox=(CheckBox)convertVIEw.findVIEwByID(R.ID.checkBox);        convertVIEw.setTag(vIEwHolder);    }    else{        vIEwHolder = (VIEwHolder) convertVIEw.getTag();    }    vIEwHolder.nameText.setText(data[position].getname());    vIEwHolder.surnameText.setText(data[position].getSurname());    vIEwHolder.contactimage.setimageResource(data[position].getPhotoRes());    vIEwHolder.contactimage.setScaleType(ScaleType.FIT_XY);    vIEwHolder.checkBox.setChecked(checkBoxState[position]);    vIEwHolder.checkBox.setonClickListener(new VIEw.OnClickListener() {           public voID onClick(VIEw v) {               if(((CheckBox)v).isChecked()){                   checkBoxState[position]=true;                   data[position].setCheck(true);               }else{                   checkBoxState[position]=false;                   data[position].setCheck(false);               }            }        });    return convertVIEw;}static class VIEwHolder {    TextVIEw nameText;    TextVIEw surnameText;    ImageVIEw contactimage;    CheckBox checkBox;}

}

我看过这个教程来做我的getVIEw:http://androidcocktail.blogspot.it/2012/04/adding-checkboxes-to-custom-listview-in.html

解决方法 使用new甚至在方法中创建类时,您已为变量创建了不同的范围.换一种说法:

// Creating a new scope here -->       vvvvIEwHolder.checkBox.setonClickListener(new OnClickListener() {    // Any variables not visible to the entire class,won't work properly in here!     //  (variables like: vIEwHolder,position,possibly data)     public voID onClick(VIEw arg0) {          if(vIEwHolder.checkBox.isChecked()==true)               data[position].setCheck(true);          else              data[position].setCheck(false);      }  }); // Exited "new class'" scope

位置与您认为的位置不同.尝试保存位置值,您可以再次引用它:

vIEwHolder.checkBox = (CheckBox) convertVIEw.findVIEwByID(R.ID.checkBox);vIEwHolder.position = position;convertVIEw.setTag(vIEwHolder);...vIEwHolder.checkBox.setonClickListener(new OnClickListener() {      public voID onClick(VIEw vIEw) {        VIEwHolder vIEwHolder = (VIEwHolder) vIEw.getTag();        data[vIEwHolder.position].setCheck(vIEwHolder.checkBox.isChecked());       }  });

因为你正在处理CheckBox,我建议使用OnCheckedChangeListener.

但是,如果更改ChoiceMode,则可能不需要为ListVIEw行定义任何侦听器:

ListVIEw.setChoiceMode(ListVIEw.CHOICE_MODE_MulTIPLE);
总结

以上是内存溢出为你收集整理的android – 滚动我的自定义ListView时,Checkbox丢失了检查值全部内容,希望文章能够帮你解决android – 滚动我的自定义ListView时,Checkbox丢失了检查值所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1126625.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存