【问题标题】:Checkedtextview check/uncheck after scroll Listview滚动 Listview 后 Checkedtextview 检查/取消选中
【发布时间】:2016-11-26 12:27:18
【问题描述】:

我正在使用viewHolder 和getview 在listvew 中开发checkedtextview。从数据库填充检查/取消检查状态绑定运行良好。但是,如果我检查项目然后滚动列表视图,它将返回取消选中。

这是我的 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;
}}

提前致谢。

【问题讨论】:

    标签: android listview android-viewholder getview android-checkedtextview


    【解决方案1】:

    那是因为您传递的列表(项目)具有旧值。当您更改检查状态时,将其更新为填充到列表视图的列表(项目)。滚动列表视图将再次加载它们,它在哪里获得旧值。

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

    【讨论】:

    • super,所以基本上在滚动列表视图上会加载适配器还是如何?
    • listview 一次只加载屏幕上的项目。当您开始滚动时,它会加载新项目并丢失旧项目。然后当我们再次向上滚动时,它会从您提供给它的列表中加载项目
    • 这条线从何而来? item.getAutoid();
    • 与所提问题有关..与概念无关
    【解决方案2】:

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

    要修复它,您可以存储是否在布尔列表中检查了一个项目(与您的项目列表大小相同),并在您的 getView 中将您的项目设置为检查相同位置的布尔值是否为真。

    【讨论】:

      猜你喜欢
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 2018-04-20
      • 1970-01-01
      相关资源
      最近更新 更多