Intereting Posts
Цвет текста элемента меню Проект Eclipse android всегда увлекается отладкой Android Media Player играет на заднем плане, но не останавливается, когда приложение убито Не удается переопределить ресурс xml библиотеки с ресурсом png в приложении? Андроид запускает пользовательскую активность на кнопке поиска нажатой @ телефонной трубки Как установить часовой пояс в Crashlytics? Размер значка панели действий Android Studio: дубликаты файлов, скопированных в APK META-INF / DEPENDENCIES при компиляции Как поместить несколько размеров виджетов в один apk? Как добавить «Библиотечный проект» в IntelliJ IDEA? Регистр вещательного приемника в манифесте против активности Прозрачная активность, заполняющая весь экран Предоставление разрешений для проявления проекта Android .aar library Правильный способ получения DisplayMetrics: getResources () или getWindowManager () Окно Eclipse Logcat отключает следы стека исключений

Android: привязка данных из базы данных к CheckBox в ListView?

Я пытаюсь связать данные из моей SQLiteDatabase с ListView . В настоящее время я использую SimpleCursorAdapter для заполнения SimpleCursorAdapter ListView . К сожалению, это не работает с установкой проверяемого атрибута CheckBox.

Вот как я это делаю сейчас; Вместо изменения проверяемого состояния CheckBox адаптер заполняет значение текстовому аргументу, поэтому значение отображается справа от CheckBox как текст.

Ява:

 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:

 <?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> 

Изменить. Поле в базе данных, конечно, имеет тип boolean, и я также попытался присвоить идентификатор проверяемому полю, чтобы заполнить значение.

Solutions Collecting From Web of "Android: привязка данных из базы данных к CheckBox в ListView?"

Я не уверен, как вы это сделаете, помимо создания настраиваемого адаптера, который перекроет newView / bindView или getView, в зависимости от того, что вы переопределите (ResourceCursorAdapter является хорошим).

Хорошо, вот пример. Я не проверял, будет ли он компилироваться, потому что я на работе, но это обязательно должно указывать вам в правильном направлении:

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

Вы можете установить пользовательский 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; } }); 

Метод setViewValue вызывается для каждого столбца, который вы указываете в конструкторе SimpleCursorAdapter и дает вам хорошее место для манипулирования некоторыми (или всеми) представлениями.

Вы можете решить эту проблему, создав собственный виджет 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(""); } } } 

Функция onTextChanged будет вызываться, когда ListView связывает данные с CheckBox (т.е. добавляет либо «0», либо «1»). Это заставит это изменение и добавит вашу логическую обработку. 1-й оператор «если» необходим, чтобы не создавать бесконечную рекурсию.

Затем укажите свой собственный класс в файл макета как таковой:

 <com.example.CustomCheckBox android:id="@+id/rowCheckBox" android:layout_height="fill_parent" android:layout_width="wrap_content" /> 

Это должно быть!