Android: Daten von einer database an eine CheckBox in einem ListView binden?

Ich versuche, Daten von meiner SQLiteDatabase an eine ListView zu binden. Ich benutze derzeit einen SimpleCursorAdapter , um meine ListView . Leider scheint dies nicht mit dem Setzen eines CheckBox-Attributs zu funktionieren.

So mache ich es jetzt; Anstatt den Check-Status der CheckBox zu ändern, füllt der Adapter den Wert in das Argument text, sodass der Wert rechts neben der CheckBox als Text angezeigt wird.

Java:

 setListAdapter( new SimpleCursorAdapter( this, R.layout.mylist, data, new String[] { database.DB_STATE, database.DB_NAME }, new int[] { R.id.list_checkbox, R.id.list_text } ) ); 

MeineListe.xml:

      

Bearbeiten: Das Feld in der database ist natürlich vom Typ boolean und ich habe auch versucht, dem überprüften Feld eine ID zuzuweisen, um den Wert zu füllen.

   

Ich bin mir nicht sicher, wie Sie dies tun würden, abgesehen von der Erstellung eines benutzerdefinierten Adapters, der newView / bindView oder getView überschreibt, je nachdem, was Sie überschreiben (ResourceCursorAdapter ist ein guter).

Ok, also hier ist ein Beispiel. Ich habe nicht getestet, ob es kompiliert wird, weil ich bei der Arbeit bin, aber das sollte dich definitiv in die richtige Richtung weisen:

 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(database.DB_NAME))); cbListCheck.setChecked((cur.getInt(cur.getColumnIndex(database.DB_STATE))==0? false:true)))); } } } 

Sie könnten einen benutzerdefinierten 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; } }); 

Die setViewValue Methode wird für jede Spalte aufgerufen, die Sie im SimpleCursorAdapter Konstruktor angeben, und bietet Ihnen eine gute SimpleCursorAdapter , einige (oder alle) Ansichten zu SimpleCursorAdapter .

Sie können dieses Problem lösen, indem Sie ein benutzerdefiniertes CheckBox-Widget wie folgt erstellen:

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

Die function onTextChanged wird aufgerufen, wenn ListView die Daten an die CheckBox bindet (dh entweder “0” oder “1” hinzufügt). Dadurch wird diese Änderung abgefangen und Ihre boolesche Verarbeitung hinzugefügt. Die erste “if” -statement wird benötigt, um keine unendliche Rekursion zu erzeugen.

Stellen Sie dann Ihre benutzerdefinierte class als solche in die Layoutdatei ein:

  

Das sollte es tun!