android-如何将复选框绑定到列表视图
作者:互联网
我有一个列表视图,在每一行上都包含一个带有复选框的文本视图,因此当选中该复选框并且我们在列表视图中向下滚动时,该复选框实例将从一个地方移到另一个地方(重用..),我还选中了几个复选框要解决我试图将复选框绑定到列表视图但无法正常工作的问题,我的代码是:
SimpleCursorAdapter adapter =new SimpleCursorAdapter(this,R.layout.rating,cu,new String[]{"Title","Favorites"}, new int[]{R.id.text1,R.id.bt_rating},CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
listv.setAdapter(adapter);
adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder(){
/** Binds the Cursor column defined by the specified index to the specified view */
public boolean setViewValue(View view, Cursor cursor, int columnIndex){
if(view.getId() == R.id.bt_rating){
((CheckBox)view).setChecked(Boolean.valueOf(cursor.getString(cursor.getColumnIndex("Favorites"))));
((CheckBox)view).setOnCheckedChangeListener(myCheckChangList);
return true; //true because the data was bound to the view
}
return false;
}
});
OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
buttonView.setChecked(isChecked);
}
};
我的listview行内容的xml代码是:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<CheckBox
android:id="@+id/bt_rating"
android:focusable="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:button="@android:drawable/btn_star"/>
<TextView
android:id="@+id/text1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="@dimen/fsinlistview"
/>
</LinearLayout>
解决方法:
看来您的OnCheckedChangedListener是这里的问题.如果您查看代码,则可以看到每个复选框都引用了同一侦听器.因此,当您选中一个框时,也将所有其他框都设置为选中状态-而且您也不会更新后备数据.
您的OnCheckedChangedListener不应更新复选框的视图状态-触发回调是因为状态已经更改.
因此,当用户选中复选框时,您需要执行以下步骤:
>找出已检查的项目,以及该项目如何与您的数据对应
>更新您的数据以适应新的选中/未选中状态
>通知适配器数据更改/更新光标
您可以执行以下操作,用其表示的行的ID标记视图:
public boolean setViewValue(View view, Cursor cursor, int columnIndex){
if(view.getId() == R.id.bt_rating){
view.setTag(cursor.getInt(cursor.getColumnIndex(SomeDBContract.ID)));
((CheckBox)view).setChecked(Boolean.valueOf(cursor.getString(cursor.getColumnIndex("Favorites"))));
((CheckBox)view).setOnCheckedChangeListener(myCheckChangList);
return true; //true because the data was bound to the view
}
return false;
}
然后,您可以在侦听器中根据该ID更新数据库:
CheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
int rowId = (int) buttonView.getTag();
// Handle updating the database as per normal
updateSomeDbRowAsChecked(rowId, isChecked);
}
};
最后,一旦数据库行更新,您将需要使用新的游标更新游标适配器:
myAdapter.swapCursor(newCursor);
您必须对所有这些进行调整以适合您的代码,但这应该使您对解决此问题的一种方式有所了解.
标签:android,listview,simplecursoradapter,android-viewbinder 来源: https://codeday.me/bug/20191012/1899212.html