0

J'ai essayé d'ajouter des séparateurs horizontaux à mon GridLayout RecyclerView. Mais pour une raison quelconque, les diviseurs ne sont pas apparus. Comme alternative, j'ai utilisé la méthode addItemDecoration avec 2 paramètres, où le deuxième paramètre est l'index après lequel ajouter ItemDecoration.Ajout de diviseurs dans GridLayout RecyclerView

RecyclerView r = (RecyclerView) findViewById(R.id.recycler_view); 
r.setAdapter(new AppAdapter(this, fetchData()); 
r.setLayoutManager(new GridLayoutManager(this, 5)); 
r.addItemDecoration(new DividerItemDecoration(this, GridLayoutManager.HORIZONTAL), 2); 

Et la force fermée à l'exception suivante:

Caused by: java.lang.IndexOutOfBoundsException: Index: 2, Size: 0 

Qu'est-ce que cela signifie Taille? Pourquoi est-ce nul? Est-ce parce que j'utilise RecyclerView dans une activité plutôt qu'un fragment?

P.S .: Il n'y a aucun problème avec l'adaptateur; ce n'est pas vide.

+0

Lorsque vous addItemDecoration (nouveau DividerItemDecoration (ce, GridLayoutManager.HORIZONTAL), 2); vous essayez d'ajouter le diviseur à l'index 2, mais l'erreur vous indique que cela est hors limites parce que le nombre d'enfants dans le RecyclerView est 0 (il est vide). Débarrassez-vous de cette ligne, et laissez-moi savoir si quelque chose est montré. – Luke

+0

L'adaptateur ou le recyclerView n'est pas vide. Une liste appropriée est affichée sans écrire cette ligne. – Sagar

+0

Combien d'articles sont dans votre liste? S'il y a moins de 10 (alias moins de 2 lignes), cela peut être le problème – Luke

Répondre

1

L'erreur est parce que vous dites la RecyclerView attirer votre numéro de décoration 2, sans dire ce qu'il faut dessiner le numéro 1 et 0.

(Il est mis en œuvre en tant que ArrayList de décorations pour dessiner dans l'ordre, et il est en essayant d'insérer votre décoration à l'index 2 dans un ArrayList vide - donc OutOfBounds)

Modifier: Voici un exemple de travail:

Je l'ai testé ce code, et il fonctionne très bien si vous faites ce qui suit changements:

1- Utilisez la version à paramètre unique de la méthode, la version indexée donnera des limites comme expliqué (vous devez commencer l'indexation à partir de 0).

r.addItemDecoration(new SpacesItemDecoration(10)); 

2- Utilisez la classe ItemDecoration suivante:

public class SpacesItemDecoration extends RecyclerView.ItemDecoration { 
    private int space; 

    public SpacesItemDecoration(int space) { 
     this.space = space; 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
     outRect.bottom = space; 
    } 
} 

Cela vous donnera l'espace que dans le fond (pour cloisons horizontales).

3 - Changer votre mise en page de RecyclerView de telle sorte que la couleur de fond de votre RecyclerView est la couleur que vous voulez que les séparateurs soient:

<android.support.v7.widget.RecyclerView 
                android:layout_width="match_parent" 
                android:layout_height="match_parent" 
                android:background="#000000"> # DIVIDER COLOUR 

      </android.support.v7.widget.RecyclerView> 

4- Modifier votre mise en page de l'élément de telle sorte que l'arrière-plan de l'élément racine est pas transparent, et non la même couleur que le RecyclerView (évidemment)

<RelativeLayout 
      android:id="@+id/item_root" 
      android:background="#cc00cc" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

le rien raison montrait avant peut-être parce que l'arrière-plan RecyclerView et l'arrière-plan de l'article étaient les mêmes, de sorte que le diviseur était pas visible.

Cette méthode fonctionne à la fois avec les gestionnaires de mise en page linéaire et linéaire.

J'espère que cela (enfin!) Aide :)

+0

J'ai déjà essayé d'utiliser une classe de décoration d'objet personnalisée. L'exception IndexOutOfBounds continue toujours à apparaître. – Sagar

+0

Voulez-vous dire que vous obtenez l'erreur lors de l'utilisation de LinearLayoutManager? – Luke

+0

Je voulais dire, j'ai créé une classe ItemDecoration personnalisée spécifique à GridLayoutManager et elle échouait toujours de la même manière. – Sagar