Checkedtextview check/uncheck 滚动列表视图后
Checkedtextview check/uncheck after scroll Listview
我正在使用 viewHolder 和 getview 在 listvew 中开发 checkedtextview。从数据库填充 check/uncheck 状态绑定是 运行 很好。但是,如果我选中项目然后滚动列表视图,它将返回取消选中状态。
这是我的自定义适配器代码。
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;
}}
提前致谢。
那是因为您传递的列表(项目)有旧的 value.When 您更改检查状态,将其更新为填充到 listview.On 的列表(项目) 滚动列表视图将再次加载它们的项目,它正在获取旧值。
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 中将您的项目设置为检查相同位置的布尔值是否为真。
我正在使用 viewHolder 和 getview 在 listvew 中开发 checkedtextview。从数据库填充 check/uncheck 状态绑定是 运行 很好。但是,如果我选中项目然后滚动列表视图,它将返回取消选中状态。
这是我的自定义适配器代码。
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;
}}
提前致谢。
那是因为您传递的列表(项目)有旧的 value.When 您更改检查状态,将其更新为填充到 listview.On 的列表(项目) 滚动列表视图将再次加载它们的项目,它正在获取旧值。
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 中将您的项目设置为检查相同位置的布尔值是否为真。