Java 动态生成的复选框将在scroll上重置
我有一个带有适配器的列表视图,在其中我创建了一些复选框,在适配器中我添加了一个on change监听器来更改领域数据库中的值。就在上面,我得到了存储在数据库中的当前值,以保持以前的值 这似乎工作得相当好,但当您滚动时,您已选中的项目将在通过屏幕时变为未选中 如图所示: 生成此命令的代码: Adapter.javaJava 动态生成的复选框将在scroll上重置,java,android,realm,android-adapter,Java,Android,Realm,Android Adapter,我有一个带有适配器的列表视图,在其中我创建了一些复选框,在适配器中我添加了一个on change监听器来更改领域数据库中的值。就在上面,我得到了存储在数据库中的当前值,以保持以前的值 这似乎工作得相当好,但当您滚动时,您已选中的项目将在通过屏幕时变为未选中 如图所示: 生成此命令的代码: Adapter.java if(check != null){ viewHolder.checkbox.setText(check.title); if (check.completed
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;
}
}
公共类ChecksAdaptor扩展ArrayAdapter{
公共领域结果检查;
语境;
//视图查找缓存
私有静态类视图持有者{
复选框;
}
公共检查适配器(RealmResults检查,上下文){
超级(上下文、右布局、检查行、检查项);
this.checks=检查;
this.mContext=上下文;
}
private int lastPosition=-1;
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
//获取此职位的数据项
最终设备检查=获取项目(位置);
//检查是否正在重用现有视图,否则会膨胀视图
ViewHolder ViewHolder;//存储在标记中的视图查找缓存
最终查看结果;
if(convertView==null){
viewHolder=新的viewHolder();
LayoutInflater充气器=LayoutInflater.from(getContext());
convertView=充气机。充气(R.layout.check\u row\u item,父项,false);
viewHolder.checkbox=convertView.findViewById(R.id.checkbox);
结果=转换视图;
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
结果=转换视图;
}
最后位置=位置;
如果(检查!=null){
viewHolder.checkbox.setText(check.title);
如果(check.completed==1){
viewHolder.checkbox.setChecked(true);
}否则{
viewHolder.checkbox.setChecked(false);
}
viewHolder.checkbox.setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener()){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
如果(已检查){
check.setCompleted();
}否则{
check.setNotCompleted();
}
}
});
}
//返回要在屏幕上渲染的已完成视图
返回视图;
}
}
根据
什么是
check
?这是传递到适配器的检查列表中的项目,该对象需要是ViewHolder的一部分。请在if(check!=null){
insertviewHolder.checkbox.setoncheckedchangelister(null)
viewHolder.checkbox.setOnCheckedChangeListener(null)