Android Checkedtextview在滚动列表视图后选中/取消选中

Android Checkedtextview在滚动列表视图后选中/取消选中,android,listview,android-viewholder,getview,android-checkedtextview,Android,Listview,Android Viewholder,Getview,Android Checkedtextview,我正在使用viewHolder和getview在listvew中开发checkedtextview。从数据库填充检查/取消检查状态绑定运行良好。但,若我选中该项,然后滚动listview,它将返回到取消选中状态 这是我的customAdapter代码 public class CustomAdapter extends ArrayAdapter<Model> { private Activity activity; int id; String autoid; ArrayList&l

我正在使用viewHolder和getview在listvew中开发checkedtextview。从数据库填充检查/取消检查状态绑定运行良好。但,若我选中该项,然后滚动listview,它将返回到取消选中状态

这是我的customAdapter代码

public class CustomAdapter extends ArrayAdapter<Model> {
private Activity activity;
int id;
String autoid;
ArrayList<Model> items;
DatabaseHelper dbhelper = new DatabaseHelper(getContext());

public CustomAdapter(Activity context, int resource, ArrayList<Model> obj) {
    super(context, resource, obj);

    this.activity = context;
    this.id = resource;
    this.items = obj;

    try {
        dbhelper.openDatabase();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}



static class ViewHolder {
    protected CheckedTextView textView;
}

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

    if (convertView == null) {

        LayoutInflater inflater = activity.getLayoutInflater();
        convertView = inflater.inflate(id, null);
        vh = new ViewHolder();
        convertView.setTag(vh);

        vh.textView = (CheckedTextView) convertView.findViewById(R.id.textbox1);

    }
    else
    {
        vh = (ViewHolder) convertView.getTag();

    }

    final Model item = items.get(position);
    String status = item.getStatus();

    final Model check = getItem(position);

    final ViewHolder finalVh = vh;

    vh.textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            autoid = item.getAutoid();

            if (! finalVh.textView.isChecked()) {
                finalVh.textView.setChecked(true);
            }
            else
            {
                finalVh.textView.setChecked(false);
            }
        }
    });

    vh.textView.setText(item.getDate() +". "+item.getInfo());
    vh.textView.setChecked(Boolean.parseBoolean(status));

    return convertView;
}}
公共类CustomAdapter扩展了ArrayAdapter{
私人活动;
int-id;
字符串自动识别;
数组列表项;
DatabaseHelper dbhelper=新的DatabaseHelper(getContext());
公共CustomAdapter(活动上下文、int资源、ArrayList obj){
超级(上下文、资源、obj);
这个活动=上下文;
this.id=资源;
此项=obj;
试一试{
dbhelper.openDatabase();
}捕获(SQLE异常){
e、 printStackTrace();
}
}
静态类视窗夹{
受保护的CheckedTextView文本视图;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视窗持有人vh=空;
if(convertView==null){
LayoutInflater充气器=活动。getLayoutInflater();
convertView=充气机。充气(id,空);
vh=新的视窗支架();
convertView.setTag(vh);
vh.textView=(CheckedTextView)convertView.findViewById(R.id.textbox1);
}
其他的
{
vh=(ViewHolder)convertView.getTag();
}
最终模型项=项。获取(位置);
字符串状态=item.getStatus();
最终模型检查=获取项目(位置);
最终视图持有人最终视图H=vh;
vh.textView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
autoid=item.getAutoid();
如果(!finalVh.textView.isChecked()){
finalVh.textView.setChecked(true);
}
其他的
{
finalVh.textView.setChecked(false);
}
}
});
vh.textView.setText(item.getDate()+“+item.getInfo());
vh.textView.setChecked(Boolean.parseBoolean(status));
返回视图;
}}
提前感谢。

这是因为您传递的列表(项目)具有旧值。当您更改检查状态时,请将其更新为列表(项目),并填充到列表视图中。滚动列表视图时,将再次加载这些项目,从中获取旧值

vh.textView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        autoid = item.getAutoid();

        if (! finalVh.textView.isChecked()) {
            finalVh.textView.setChecked(true);
            item.setStatus("true")
        } else {
            finalVh.textView.setChecked(false);
            item.setStatus("false");
        }
        items.set(position, item);
    }
});

这是因为您的ViewHolder是重复使用的,在ListView中,您在列表中没有相同的实例号ViewHolder和元素,您显示的项目数大约为


若要修复此问题,您可以存储是否在布尔列表(与项目列表大小相同)中选中了某个项目,并在getView中将项目设置为选中,以确定布尔值是否在同一位置为真。

super,因此基本上滚动列表视图将加载适配器或加载方式?列表视图一次只加载屏幕上的项目。当您开始滚动时,它会加载新项目并释放旧项目。然后当我们再次滚动时,它会从您提供给它的列表中加载项目。此行来自何处<代码>item.getAutoid()。它与概念无关