我修复了 Android 代码,但我想知道旧版本有什么问题
-
20-12-2019 - |
题
我有一个包含复选框和文本视图的列表视图,我已经向我的适配器添加了一个 ViewBinder,在这个 viewbinder 中我向我的复选框添加了一个 onchecked 状态侦听器,在 onchecked 状态侦听器中我编写了以下代码:
OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
String id=buttonView.getTag()+"";
int buttonid=Integer.valueOf(id);
if(buttonView.isChecked()==true){
Log.d("checked","checked");
myDbHelper.MarkAsFavorite(buttonid);
}
else if(buttonView.isChecked()==false){
Log.d("unchecked","unchecked");
myDbHelper.UnMarkAsFavorite(buttonid);
}
cu=myDbHelper.GetCursor();
adapter.swapCursor(cu);
}
};
但是使用此代码,当我的复选框被选中时,它被保存在数据库中,然后当我滚动列表视图时,它会自行取消选中,它会访问未选中的代码并取消选中复选框并将其保存在数据库中。
因此,我通过向复选框添加 onclick 侦听器而不是 onchange 状态侦听器来修复此问题:
public void onclick(View view) {
String id=view.getTag()+"";
int buttonid=Integer.valueOf(id);
if(((CompoundButton) view).isChecked()==true){
Log.d("checked","checked");
myDbHelper.MarkAsFavorite(buttonid);
}
else if(((CompoundButton) view).isChecked()==false){
Log.d("unchecked","unchecked");
myDbHelper.UnMarkAsFavorite(buttonid);
}
cu=myDbHelper.GetCursor();
adapter.swapCursor(cu);
}
我没有更多的问题了。但我想知道为什么这个改变状态侦听器会那样做?
解决方案
你有这个 checkbox
里面 ListView
由于 ListView 重用视图以提高效率,因此可以将相同的复选框对象提供给多个 ListView 项目,并且当选中同一复选框时,不会选中另一个复选框。
其他提示
此更改状态侦听器仅当您滚动ListView时才能采用该方法,因为它再次更改选中的复选框状态,因此ChecionChangedListner调用数据库中的值更改。当您使用onclick时,您的问题已解决,因为在更改ListView View View View View OnClick事件,而不是未更改数据库值的触发。
您可以通过使用ListView中的视图来解决此问题。
不隶属于 StackOverflow