2011-08-14 5 views
1

J'ai maintenant passé une journée entière à essayer d'obtenir une ligne personnalisée à charger. Il semble y avoir beaucoup d'exemples ici sur StackOverflow et d'autres endroits sur la façon de lier une case à cocher à une rangée de données dans une liste de lecture Android, mais ils semblent tous être incomplets.Android ListView avec une case à cocher

Voici ce que j'ai (row.xml):

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" android:layout_height="40dip" 
    android:orientation="horizontal" android:background="@drawable/row_bk" 
    android:layout_gravity="center_vertical"> 

    <TextView android:id="@+id/ItemID" 
    android:layout_weight="0" android:visibility="gone" 
     android:layout_width="0dp" android:gravity="center" 
    android:layout_height="wrap_content" /> 

<TextView android:id="@+id/Title" 
    android:layout_width="0dp" android:textColor="#666" 
    android:layout_weight="1" android:layout_height="40dip" 
    android:padding="5dp" android:gravity="center_vertical" 
    android:textSize="17dip" /> 

<CheckBox android:id="@+id/chkCheck" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:focusable="false" android:focusableInTouchMode="false" android:clickable="true"></CheckBox> 

</LinearLayout> 

Dans le code, j'ai un SimpleCursorAdapter, peuplant le ListView.

Cursor oLoop = db 
      .rawQuery(
      "select _id, title, is_checked from tbl",null); 

    startManagingCursor(oLoop); 

    String[] from = new String[] { "_id", "title", "is_checked" }; 

    int[] to = new int[] { R.id.ItemID, R.id.Title, R.id.chkCheck }; 

    SimpleCursorAdapter oList = 
    new SimpleCursorAdapter (this, R.layout.task_item_row, oLoop, from, 
    to); 

    setListAdapter(oList); 

Passé ce délai, je ne suis pas vraiment sûr de ce qu'il faut faire. Si quelqu'un pouvait me donner un bon exemple, ce serait formidable. L'objectif est de pouvoir basculer les cases à cocher.

Merci d'avance! Alex

Répondre

1

Alex,

L'étape suivante consiste à mettre en œuvre ViewBinder.setViewValue()

Il ressemblerait à quelque chose comme ceci:

getViewAdapter().setViewBinder(
    new ViewBinder(){ 
     public boolean setViewAdapter(View view, Cursor cursor, int columnIndex){ 
      <JavaType> object = cursor.get<JavaType>(columnIndex); 

      boolean isHandled = false; 
      if(view.getId() == R.id.checkBox){ 
       CheckBox cb = (CheckBox) view; 
       cb.setChecked(isObjectChecked(object)); 
       // object depends on your underlying data type 
       // in the data base, use the debugger to find the actually implemented type. 
       isHandled = true; 
      } 

      return isHandled; 
     } 
    } 
); 

Cela peut être une méthode très puissante avec des vues conditionnellement visibles et chargement Uri vient du réseau, etc.

+0

Yup, c'est fait! C'était la pièce qui me manquait !! Certainement, pas une étape évidente non plus. Je vais devoir documenter cela quelque part pour la postérité. – LTMOD

+0

@LTMOD Son dans la documentation [SimpleAdapter] (http://developer.android.com/reference/android/widget/SimpleAdapter.html). –

Questions connexes