0

J'ai un RecyclerView qui affiche la liste des modifications par jour pour un document. Les articles sont TextView avec des valeurs comme "ligne 3 mis à jour ...", "Ligne 5 enlevé", etc. Les ViewHolder poignée 2 types de vues:Incorporer des éléments d'un RecyclerView dans CardViews

  • têtes: qui sont les jours. Ceux-ci sont simples TextView aussi qui sont en gras, plus, etc.
  • Journaux: c'est ce que je parlais: « La ligne 3 mise à jour ... », etc.

Ce que je voudrais est chaque "jour", avec ses journaux correspondants sont incorporés dans un CardView. Mais un document peut avoir un nombre énorme de modifications par jour (> 100). Donc créer par programmation une mise en page avec un CardView en tant que root, en appelant 100 fois addView() dessus pour ajouter chaque logs puis en passant cette mise en page au RecyclerView ne me semble pas être une bonne idée.

Est-il possible de délimiter entre des vues "positionStart" et "positionEnd" qui seront incorporées dans un CardView? Il me semble que ce n'est pas possible ou en ajoutant chaque TextView par programme à l'intérieur d'un CardView mais cela va ralentir la liaison des vues et casser le modèle ViewHolder. Ai-je raison ou est-ce une solution à laquelle je n'ai pas pensé?

Répondre

1

Vous avez 3 options pour réaliser ce comportement "groupé dans une carte".

  1. (comme mentionné) vous créez vous-même la mise en page et mettre le tout dans le recyclerview. C'est probablement la pire des solutions car elle nie l'idée d'un recyclerview en premier lieu.

  2. Vous venez d'envelopper chacun de vos éléments dans un CardView (et définissez le rayon du coin sur 0dp).
    Sur les périphériques 2112 (je pense) il y aura un rembourrage supplémentaire et chaque élément apparaîtra comme sa propre carte, mais sur les versions supérieures de l'API, ces cartes se tiendront côte à côte et auront un "joint". L'ombre sur le coin est aussi un peu boguée, mais c'est probablement la solution la plus simple et la moins chère. Vous pouvez également créer une vue personnalisée qui corrige les erreurs mentionnées ci-dessus (marges entre et ombre) et utiliser la vôtre pour envelopper les vues. (Je crois que c'est ce que fait l'application Inbox si je me souviens bien, qui comporte également des listes dans les cartes.)

  3. Vous utilisez un ItemDecoration. Pour cette approche, vous avez besoin d'une configuration stable de votre jeu de données, mais si ce n'est que les en-têtes et les journaux, dessinez une ombre au-dessus de l'en-tête, dessinez des bordures à gauche et à droite de chaque élément. bûche. Il faudra aussi une certaine configuration, et si vous introduisez d'autres types de vue, vous aurez également de modifier ce code (il est très dépendant de votre ensemble de données)


Le 1. Méthode est probablement la pire idée. Cela fonctionnera pour les petites listes.

Le 2.La méthode peut fonctionner, mais vous devrez créer votre propre vue personnalisée ou vivre avec une version "buggée" sur les niveaux d'api inférieurs.

La méthode 3. est quelque chose que j'ai essayé une fois pour m'amuser, et qui fonctionnera, mais vous aurez une dépendance supplémentaire entre vos données, votre adaptateur et votre décoration. Vous pouvez voir un exemple de ceci decoration here on GitHub. Il dessine juste une ombre autour de tous les éléments.

+0

Désolé pour le commentaire en retard, je ne pouvais pas travailler sur ce point en raison de la gestion de projet .. Mais bon, j'ai essayé votre 'ItemDecoration' et ça marche bien! J'ai juste un problème avec le dernier élément, il ne montre pas l'ombre du 'CardView'. Je suppose que le problème est dans 'onDrawOver', j'ai réussi à détecter quand je suis sur le dernier élément (peu importe si c'est un en-tête ou non) mais je suis très mauvais avec le dessin sous Android et je ne peux pas parvient à définir l'ombre du fond au bon endroit, peut-être que vous pourriez aider? Encore merci pour la réponse géniale et détaillée! – MHogge