动态构建的复选框在滚动时被重置
dynamically built checkboxes are being reset on scroll
我有一个带有适配器的列表视图,我在其中创建了一些复选框,在适配器中我添加了一个更改监听器来更改我的领域数据库中的值。在此之上,我正在获取存储在数据库中的当前值以保留以前的值。
这似乎工作得很好,但是当您滚动时,您选中的项目在经过屏幕时将变为未选中状态。
如此处所示:
生成此代码的代码:
Adaptor.java
if(check != null){
viewHolder.checkbox.setText(check.title);
if (check.completed == 1) {
viewHolder.checkbox.setChecked(true);
} else {
viewHolder.checkbox.setChecked(false);
}
viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
check.setCompleted();
} else {
check.setNotCompleted();
}
}
});
}
Fragment.java
final ChecksAdaptor checksAdaptor = new ChecksAdaptor(device.checks(), getContext());
listView.setAdapter(checksAdaptor);
完全适配器
public class ChecksAdaptor extends ArrayAdapter<DeviceCheck> {
public RealmResults<DeviceCheck> checks;
Context mContext;
// View lookup cache
private static class ViewHolder {
CheckBox checkbox;
}
public ChecksAdaptor(RealmResults<DeviceCheck> checks, Context context) {
super(context, R.layout.check_row_item, checks);
this.checks = checks;
this.mContext=context;
}
private int lastPosition = -1;
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// Get the data item for this position
final DeviceCheck check = getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
ViewHolder viewHolder; // view lookup cache stored in tag
final View result;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.check_row_item, parent, false);
viewHolder.checkbox = convertView.findViewById(R.id.checkbox);
result=convertView;
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
result=convertView;
}
lastPosition = position;
if(check != null){
viewHolder.checkbox.setText(check.title);
if (check.completed == 1) {
viewHolder.checkbox.setChecked(true);
} else {
viewHolder.checkbox.setChecked(false);
}
viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
check.setCompleted();
} else {
check.setNotCompleted();
}
}
});
}
// Return the completed view to render on screen
return convertView;
}
}
根据mTak
的建议
viewHolder.checkbox.setOnCheckedChangeListener(null)
我有一个带有适配器的列表视图,我在其中创建了一些复选框,在适配器中我添加了一个更改监听器来更改我的领域数据库中的值。在此之上,我正在获取存储在数据库中的当前值以保留以前的值。
这似乎工作得很好,但是当您滚动时,您选中的项目在经过屏幕时将变为未选中状态。
如此处所示:
生成此代码的代码:
Adaptor.java
if(check != null){
viewHolder.checkbox.setText(check.title);
if (check.completed == 1) {
viewHolder.checkbox.setChecked(true);
} else {
viewHolder.checkbox.setChecked(false);
}
viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
check.setCompleted();
} else {
check.setNotCompleted();
}
}
});
}
Fragment.java
final ChecksAdaptor checksAdaptor = new ChecksAdaptor(device.checks(), getContext());
listView.setAdapter(checksAdaptor);
完全适配器
public class ChecksAdaptor extends ArrayAdapter<DeviceCheck> {
public RealmResults<DeviceCheck> checks;
Context mContext;
// View lookup cache
private static class ViewHolder {
CheckBox checkbox;
}
public ChecksAdaptor(RealmResults<DeviceCheck> checks, Context context) {
super(context, R.layout.check_row_item, checks);
this.checks = checks;
this.mContext=context;
}
private int lastPosition = -1;
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// Get the data item for this position
final DeviceCheck check = getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
ViewHolder viewHolder; // view lookup cache stored in tag
final View result;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.check_row_item, parent, false);
viewHolder.checkbox = convertView.findViewById(R.id.checkbox);
result=convertView;
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
result=convertView;
}
lastPosition = position;
if(check != null){
viewHolder.checkbox.setText(check.title);
if (check.completed == 1) {
viewHolder.checkbox.setChecked(true);
} else {
viewHolder.checkbox.setChecked(false);
}
viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
check.setCompleted();
} else {
check.setNotCompleted();
}
}
});
}
// Return the completed view to render on screen
return convertView;
}
}
根据mTak
的建议viewHolder.checkbox.setOnCheckedChangeListener(null)