1

我正在使用viewHolder和getview在listvew中开发checkedtextview。从数据库填充检查/取消选中状态绑定运行良好。但是,如果我检查项目,然后滚动listview,它会回到取消选中。Checkedtextview check /取消选中后滚动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; 
}} 

在此先感谢。

回答

2

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

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

超,所以基本上滚动listview会加载适配器还是怎么样? –

+0

listview只是一次加载屏幕上的项目。当你开始滚动时,它会加载新的项目并丢弃旧的项目。然后当我们再次滚动时,它会从你提供给它的列表中加载项目 –

+0

这条线从哪里来? 'item.getAutoid();' – grant

0

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

要解决它,如果一个项目在布尔列表(您的项目列表的大小相同)检查您可以存储在您的getView设置你的项目检查,如果在相同的位置的布尔是真实的。

相关问题