Android 滚动列表视图时复选框未选中。我的解决方案会干扰setOnCheckedChangeListener

Android 滚动列表视图时复选框未选中。我的解决方案会干扰setOnCheckedChangeListener,android,listview,checkbox,android-checkbox,Android,Listview,Checkbox,Android Checkbox,我有一个列表视图,其中有许多复选框,当在真开始时选中这些复选框时,就会出现一个TextToSpeech。现在的问题是,当我在列表视图中滚动时,我选中的所有复选框都被重置为未选中。因此,我找到了任何解决方案的教程。但在我使用的解决方案中,复选框的状态保存在一个变量中,当复选框再次可见时,将重新检查。因此,TextToSpeech再次启动。这是我的代码(我知道这不是一个好代码): 如果mcurrenttsposition!=当前位置。使用此mCurrentTtsPosition可在getView上重

我有一个
列表视图
,其中有许多
复选框
,当在真开始时选中这些复选框时,就会出现一个
TextToSpeech
。现在的问题是,当我在
列表视图中滚动时,我选中的所有
复选框都被重置为未选中。因此,我找到了任何解决方案的教程。但在我使用的解决方案中,
复选框
的状态保存在一个变量中,当
复选框
再次可见时,将重新检查。因此,
TextToSpeech
再次启动。这是我的代码(我知道这不是一个好代码):


如果mcurrenttsposition!=当前位置。使用此mCurrentTtsPosition可在getView上重新检查视图,但在这种情况下,不要调用startSpeak。播放结束后,使用片段调用的适配器的公共方法将mcurrenttsposition重置为-1

public class MyAdapter extends ArrayAdapter<Model> {


private TreeSet mSeparatorsSet = new TreeSet();
  private final List<Model> list;
  private final Activity context;
  public String textToSay;
  private int mCurrentTtsPosition = -1;

  public MyAdapter(Activity context, List<Model> list) {
      super(context, R.layout.row, list);

      this.context = context;
      this.list = list;
  }

  @Override
  public int getItemViewType(int position) {
      if (list.get(position).getVersion() == 0) {
          return 0;
      }
      return 1;
  }

  @Override
  public int getViewTypeCount() {
      return 2;
  }

  public void onStopTts(){
    mCurrentTtsPosition = -1;
    notifyDataSetChanged();
  }

  static class ViewHolder {
      public TextView text;
      public TextView text2;
      public CheckBox checkbox;
      public TextView textSeparator;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
      ViewHolder viewHolder = null;

      if (this.getItemViewType(position)== 0){
          if (convertView == null) {
              LayoutInflater inflator = context.getLayoutInflater();
              viewHolder = new ViewHolder();
              convertView = inflator.inflate(R.layout.title_row, null);
              viewHolder.textSeparator = (TextView) convertView.findViewById(R.id.textView);

              convertView.setTag(viewHolder);
              convertView.setTag(R.id.textView, viewHolder.textSeparator);

          } else {
              viewHolder = (ViewHolder) convertView.getTag();
          }
          viewHolder.textSeparator.setText(list.get(position).getName());
          return convertView;
      }

      if (convertView == null) {
          LayoutInflater inflator = context.getLayoutInflater();
          convertView = inflator.inflate(R.layout.row, null);
          viewHolder = new ViewHolder();

          viewHolder.text = (TextView) convertView.findViewById(R.id.label);
          viewHolder.text2 = (TextView)convertView.findViewById(R.id.label2);
          viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.checkBox);

          convertView.setTag(viewHolder);
          convertView.setTag(R.id.label, viewHolder.text);
          convertView.setTag(R.id.checkBox, viewHolder.checkbox);
      } else {
          viewHolder = (ViewHolder) convertView.getTag();
      }

      viewHolder.checkbox.setTag(position); // This line is important.
      viewHolder.text.setText(list.get(position).getName());
      viewHolder.text2.setText(list.get(position).getName2());
      viewHolder.checkbox.setChecked(list.get(position).isSelected());
      final CheckBox chk = (CheckBox)convertView.findViewById(R.id.checkBox);
      final View finalConvertView = convertView;

      if (position == mCurrentTtsPosition){
        chk.setChecked(true);
      }

      chk.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
          @Override
          public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
              int getPosition = (Integer) buttonView.getTag();
              list.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.

              if (isChecked && getPosition != mCurrentTtsPosition) {
                  mCurrentTtsPosition = getPosition;

                  String textPart1 = " ";
                  String textPart2 = " ";
                  String textToSay = " ";

                  TextView label2 = (TextView) finalConvertView.findViewById(R.id.label2);
                  TextView label1 = (TextView) finalConvertView.findViewById(R.id.label);



                  textPart1 = label2.getText().toString();
                  if ((getPosition + 1) < list.size()) {
                      if(list.get(getPosition+1).getVersion() == 0){
                          textPart2 = list.get(getPosition + 2).getName();
                      } else {
                          textPart2 = list.get(getPosition + 1).getName();
                      }
                  }
                  textToSay = textPart1 +
                          "\n" + "." +
                          "\n" + "." +
                          "\n" + "." +
                          "\n" + "." +
                          "\n" + "." +
                          "\n" + "." +
                          "\n" + "." +
                          "\n" + "." +
                          "\n" + "." +
                          "\n" + "." +
                          "\n" + "." +
                          textPart2;

                  OneFragment.startSpeak(textToSay);

              }
          }

      });
      return convertView;
  }
}
公共类MyAdapter扩展了ArrayAdapter{
私有树集mseparatorset=新树集();
私人最终名单;
私人最终活动背景;
公共字符串textToSay;
private int mcurrenttsposposition=-1;
公共MyAdapter(活动上下文、列表){
super(上下文、R.layout.row、列表);
this.context=上下文;
this.list=列表;
}
@凌驾
public int getItemViewType(int位置){
if(list.get(position).getVersion()==0){
返回0;
}
返回1;
}
@凌驾
public int getViewTypeCount(){
返回2;
}
公共无效onStopTts(){
mcurrenttsposposition=-1;
notifyDataSetChanged();
}
静态类视窗夹{
公共文本查看文本;
公共文本视图文本2;
公共复选框;
公共文本视图文本分隔符;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder ViewHolder=null;
if(this.getItemViewType(position)==0){
if(convertView==null){
LayoutInflater充气器=上下文。getLayoutInflater();
viewHolder=新的viewHolder();
convertView=充气机。充气(R.layout.title_行,空);
viewHolder.textSeparator=(TextView)convertView.findViewById(R.id.TextView);
convertView.setTag(viewHolder);
setTag(R.id.textView、viewHolder.textSeparator);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
viewHolder.textspeparator.setText(list.get(position.getName());
返回视图;
}
if(convertView==null){
LayoutInflater充气器=上下文。getLayoutInflater();
convertView=充气机充气(R.layout.row,空);
viewHolder=新的viewHolder();
viewHolder.text=(TextView)convertView.findViewById(R.id.label);
viewHolder.text2=(TextView)convertView.findViewById(R.id.label2);
viewHolder.checkbox=(checkbox)convertView.findViewById(R.id.checkbox);
convertView.setTag(viewHolder);
setTag(R.id.label,viewHolder.text);
setTag(R.id.checkBox,viewHolder.checkBox);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
viewHolder.checkbox.setTag(位置);//这一行很重要。
viewHolder.text.setText(list.get(position.getName());
viewHolder.text2.setText(list.get(position.getName2());
viewHolder.checkbox.setChecked(list.get(position.isSelected());
最终复选框chk=(复选框)convertView.findViewById(R.id.CheckBox);
最终视图finalConvertView=convertView;
如果(位置==mCurrentTtsPosition){
chk.setChecked(真);
}
setOnCheckedChangeListener(新的CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
int getPosition=(整数)buttonView.getTag();
list.get(getPosition).setSelected(buttonView.isChecked());//设置复选框的值以保持其状态。
if(isChecked&&getPosition!=mcurrenttsposition){
mcurrenttsposposition=getPosition;
字符串textPart1=“”;
字符串textPart2=“”;
字符串textToSay=“”;
TextView label2=(TextView)finalConvertView.findViewById(R.id.label2);
TextView标签1=(TextView)finalConvertView.findViewById(R.id.label);
textPart1=label2.getText().toString();
如果((getPosition+1)
您好,请在列表中再添加一个字段,如“selected”,并将其设置为false,然后进行如下检查。还可以在选中时更改“selected”(选定)true的值

更改
getView()
如下所示

if(list.get(position).getSelected()){
// set the checkbox selected
}else{
// set the checkbox unselected
}
并在
setOnCheckedChangeListener()中添加以下命令

if(isChecked){
list.get(position).put("selected",true));
}else{
list.get(position).put("selected",false));
}
阿奎斯
if(list.get(position).getSelected()){
// set the checkbox selected
}else{
// set the checkbox unselected
}
if(isChecked){
list.get(position).put("selected",true));
}else{
list.get(position).put("selected",false));
}