2012-07-01 6 views
1

J'ai un SimpleCursorAdapter et j'essaye de lier un SimpleCursorAdapter.ViewBinder. Voici le code que j'utilise.Android SimpleCursorAdapter.ViewBinder ne met pas à jour le TextView lié

// Setup Cursor and SimpleCursorAdapter, called in Activity onResume() 
Cursor userCursor = getUserProfile(userEmail); 
mAdapter = new SimpleCursorAdapter(this, 
       R.layout.user_profile, 
       userCursor, 
       new String[] { 
        StackOverFlow.Users.FULL_NAME, 
        StackOverFlow.Users.EMAIL }, 
       new int[] { 
        R.id.txtvwProfileUserFullName, 
        R.id.txtvwProfileOtherUserInfo }); 
mAdapter.setViewBinder(new UserProfileViewBinder()); 

Ma classe UserProfileViewBinder:

private class UserProfileViewBinder implements SimpleCursorAdapter.ViewBinder { 
    @Override 
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
     TextView tv; 
     switch (columnIndex) { 
     case 1: // TODO: Magic Numbers, bad! 
      tv = (TextView) view.findViewById(R.id.txtvwProfileUserFullName); 
      String userFullName = cursor.getString(columnIndex); 
      tv.setText(userFullName); 
      break; 
     case 2: // TODO: Magic Numbers, bad! 
      tv = (TextView) view.findViewById(R.id.txtvwProfileOtherUserInfo); 
      String userEmail = cursor.getString(columnIndex); 
      tv.setText(userEmail); 
      break; 
     } 
     return true; 

    } 
} 

Problème

Quand je charge l'activité, les années TextView ne soit pas mis à jour avec les données de la userCursor. Je peux confirmer que userCursor pointe en fait vers une ligne valide dans la base de données SQLite de support et possède des données, mais la méthode setViewValue dans UserProfileViewBinder ne semble jamais être en cours d'exécution. Je ne suis pas sûr de ce que je fais mal, ou néglige d'inclure.

Comme alternative, je fais ce qui suit pour définir le texte de TextView:

if (mAdapter.getCursor().moveToFirst()) { 
    mUserFullName.setText(mAdapter.getCursor().getString(
      StackOverFlow.USER_FULL_NAME)); 
    mUserOtherInfo.setText(mAdapter.getCursor().getString(
      StackOverFlow.USER_EMAIL)); 
} 

Mais je ne pense pas que cela mettra automatiquement à jour lorsque les modifications de données du curseur de la TextView. lorsque le ContentProvider appelle setNotificationUri après l'exécution d'une requête, et l'appel du serveur REST renvoie et le thread met à jour la ligne pointant vers le curseur.

Merci d'avance.

Répondre

3

Envisagez-vous de faire autre chose que de définir le texte sur ces deux TextViews? Si la réponse est non alors vous n'avez aucune raison d'utiliser le ViewBinder car le SimpleCursorAdapter, par défaut, va définir le texte pour vous.

Quoi qu'il en soit, je ne comprends pas pourquoi vous avez utilisé le paramètre columnIndex pour identifier les points de vue et non l'identifiant de la vue qui est passé à voir si cela aide.

public boolean setViewValue(View view, Cursor cursor, int columnIndex) {   
     if (view.getId() == R.id.txtvwProfileUserFullName) { 
      String userFullName = cursor.getString(columnIndex); 
      ((TextView) view).setText(userFullName); 
      return true; 
     } else if (view.getId() == R.id.txtvwProfileOtherUserInfo) { 
      String userEmail = cursor.getString(columnIndex); 
      ((TextView) view).setText(userEmail); 
      return true; 
     } else { 
      return false; 
     } 
} 
Questions connexes