Intereting Posts
Как фильтровать Android logcat приложением? Как исправить URL-адрес поставщика контента, который не найден в поставщике контента Android? Как создавать файловые каталоги и папки в файловой системе данных данных / данных / проекта Android Циркуляр ViewPager. Фрагменты не работают так, как они должны были после первого раунда Как включить тактическую обратную связь при просмотре кнопок Android обновляющий адаптер работает после поворота снова устройство Андроид игры, холст или opengl? Ограничения на открытие pdf-файла в Android Динамические пути в дооснащении Поиск на Play Market с локализованным именем приложения Xamarin.Android: как захватывать события Button, определенные в атрибуте XML OnClick? EditText не прокручивается внутри ScrollView Не удалось найти стиль «mapViewStyle» в текущей теме FindFragmentById для SupportMapFragment возвращает null в Android Studio Какую платформу ведения журнала Android использовать?

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" /> 

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