Android:将数据库中的数据绑定到 ListView 中的 CheckBox?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1505751/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android: Binding data from a database to a CheckBox in a ListView?
提问by svens
I'm trying to bind data from my SQLiteDatabase
to a ListView
. I'm currently using a SimpleCursorAdapter
to fill in my ListView
. Unfortunately this doesn't seem to work with setting a CheckBox's checked attribute.
我正在尝试将数据从 my 绑定SQLiteDatabase
到ListView
. 我目前正在使用 aSimpleCursorAdapter
来填写我的ListView
. 不幸的是,这似乎不适用于设置 CheckBox 的 checked 属性。
This is how I do it now; instead of changing the CheckBox's checked status the adapter is filling in the value to the text argument, so the value is displayed right of the CheckBox as text.
这就是我现在的做法;适配器将值填充到文本参数中,而不是更改 CheckBox 的选中状态,因此该值在 CheckBox 右侧显示为文本。
Java:
爪哇:
setListAdapter( new SimpleCursorAdapter( this,
R.layout.mylist,
data,
new String[] { Datenbank.DB_STATE, Datenbank.DB_NAME },
new int[] { R.id.list_checkbox, R.id.list_text }
) );
mylist.xml:
mylist.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/LinearLayout01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<CheckBox android:text=""
android:id="@+id/list_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="false"
></CheckBox>
<TextView android:text=""
android:id="@+id/list_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
></TextView>
</LinearLayout>
Edit: The field in the database is of course of type boolean and I've also tried to assign an id to the checked field to fill the value in.
编辑:数据库中的字段当然是布尔类型,我还尝试为选中的字段分配一个 id 以填充值。
采纳答案by MattC
I'm not sure how you would do this aside from creating a custom Adapter that overrode newView/bindView or getView, depending on what you override (ResourceCursorAdapter is a good one).
除了创建一个覆盖 newView/bindView 或 getView 的自定义适配器之外,我不确定你会如何做到这一点,这取决于你覆盖的内容(ResourceCursorAdapter 是一个很好的)。
Ok, so here's an example. I didn't test to see if it would compile because I'm at work, but this should definitely point you in the right direction:
好的,这是一个例子。我没有测试它是否会编译,因为我正在工作,但这绝对应该为您指明正确的方向:
public class MyActivity extends ListActivity {
MyAdapter mListAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Cursor myCur = null;
myCur = do_stuff_here_to_obtain_a_cursor_of_query_results();
mListAdapter = new MyAdapter(MyActivity.this, myCur);
setListAdapter(mListAdapter);
}
private class MyAdapter extends ResourceCursorAdapter {
public MyAdapter(Context context, Cursor cur) {
super(context, R.layout.mylist, cur);
}
@Override
public View newView(Context context, Cursor cur, ViewGroup parent) {
LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
return li.inflate(R.layout.mylist, parent, false);
}
@Override
public void bindView(View view, Context context, Cursor cur) {
TextView tvListText = (TextView)view.findViewById(R.id.list_text);
CheckBox cbListCheck = (CheckBox)view.findViewById(R.id.list_checkbox);
tvListText.setText(cur.getString(cur.getColumnIndex(Datenbank.DB_NAME)));
cbListCheck.setChecked((cur.getInt(cur.getColumnIndex(Datenbank.DB_STATE))==0? false:true))));
}
}
}
回答by Josef Pfleger
You could set a custom SimpleCursorAdapter.ViewBinder
:
您可以设置自定义SimpleCursorAdapter.ViewBinder
:
SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(/* ur stuff */);
cursorAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
if(columnIndex == 1) {
CheckBox cb = (CheckBox) view;
cb.setChecked(cursor.getInt(1) > 0);
return true;
}
return false;
}
});
The setViewValue
method is invoked for every column you specify in the SimpleCursorAdapter
constructor and gives you a good place to manipulate some (or all) of the views.
setViewValue
为您在SimpleCursorAdapter
构造函数中指定的每一列调用该方法,并为您提供一个操作部分(或全部)视图的好地方。
回答by Nick
You can solve that problem by creating a custom CheckBox widget like so:
您可以通过创建自定义 CheckBox 小部件来解决该问题,如下所示:
package com.example.CustomCheckBox;
public class CustomCheckBox extends CheckBox {
public CustomCheckBox(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CustomCheckBox(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomCheckBox(Context context) {
super(context);
}
protected void onTextChanged(CharSequence text, int start, int before, int after) {
if (text.toString().compareTo("") != 0) {
setChecked(text.toString().compareTo("1") == 0 ? true : false);
setText("");
}
}
}
The onTextChanged function will be called when the ListView binds the data to the CheckBox (ie. Adding either "0" or "1"). This will catch that change and add in your boolean processing. The 1st "if" statement is needed so as to not create infinite recursion.
当 ListView 将数据绑定到 CheckBox(即添加“0”或“1”)时,将调用 onTextChanged 函数。这将捕获该更改并添加到您的布尔处理中。需要第一个“if”语句,以免产生无限递归。
Then provide your custom class in to the layout file as such:
然后将您的自定义类提供到布局文件中,如下所示:
<com.example.CustomCheckBox
android:id="@+id/rowCheckBox"
android:layout_height="fill_parent"
android:layout_width="wrap_content" />
That should do it!
应该这样做!