2017-09-19 4 views
0

Je souhaite utiliser la bibliothèque de liaison de données Android avec un ListView rempli par un CursorAdapter personnalisé, mais je n'arrive pas à comprendre comment le faire fonctionner. Je semble une chose si simple à réaliser.Utilisation de la bibliothèque de liaison de données avec CursorAdapter

C'est ce que j'ai maintenant:

public class PlayCursorAdapter extends CursorAdapter { 
    private List<Play> mPlays; 

    PlayCursorAdapter(Context context, Cursor cursor) { 
     super(context, cursor, 0); 
     mPlays = new ArrayList<>(); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     ListItemPlayBinding binding = ListItemPlayBinding.inflate(LayoutInflater.from(context), parent, false); 
     Play play = new Play(); 
     binding.setPlay(play); 
     mPlays.add(play); 
     return binding.getRoot(); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     int timeIndex = cursor.getColumnIndexOrThrow(PlayEntry.COLUMN_TIME); 
     ... 

     long time = cursor.getLong(timeIndex); 
     ... 

     Play play = mPlays.get(cursor.getPosition()); 

     play.setTime(time); 
     ... 
    } 
} 

Comportement actuel:
Quand je lance ce code et je défiler vers le bas dans la liste je reçois un IndexOutOfBoundsException sur les mPlays liste.

Comportement souhaité:
Je veux remplir un ListView avec les données d'un ContentProvider en utilisant la bibliothèque de liaison de données et un CursorAdapter. Est-il même possible d'utiliser la bibliothèque de liaison de données avec un CursorAdapter? Ou recommandez-vous de toujours utiliser un RecyclerView et un RecyclerView.Adapter?

Répondre

0

Vous devriez être en mesure d'éviter le problème en éliminant la liste des mPlays:

public class PlayCursorAdapter extends CursorAdapter { 
    PlayCursorAdapter(Context context, Cursor cursor) { 
     super(context, cursor, 0); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     ListItemPlayBinding binding = ListItemPlayBinding.inflate(LayoutInflater.from(context), parent, false); 
     Play play = new Play(); 
     binding.setPlay(play); 
     return binding.getRoot(); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     int timeIndex = cursor.getColumnIndexOrThrow(PlayEntry.COLUMN_TIME); 
     ... 

     long time = cursor.getLong(timeIndex); 
     ... 
     ListItemPlayBinding binding = DataBindingUtil.getBinding(view); 
     Play play = binding.getPlay(); 

     play.setTime(time); 
     ... 
    } 
} 

Cela suppose que vous ne voulez pas juste instancier un nouveau jeu chaque fois que vous Bindview().

+0

Merci, cette solution a fonctionné. Je cherchais la partie 'DataBindingUtil.getBinding (view)'. Recommandez-vous d'utiliser un 'RecyvlerView.Adapter' au lieu d'un' CursorAdapter' ou est-ce trop pour cette situation? J'ai lu votre article sur Medium sur l'utilisation d'un 'RecyclerView'. –

+0

RecyclerView est un widget plus récent qui gère la plupart des cas d'utilisation de ListView et dispose de fonctionnalités supplémentaires. Vous obtiendrez également la stabilité entre les versions d'Android, car il est entièrement dans la bibliothèque de support. Donc, je dirais qu'il vaut la peine de regarder dans RecyclerView pour les mises en page futures. Cela dit, il n'y a vraiment aucune raison de changer quand quelque chose fonctionne bien pour vous. –