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