Decorador RecyclerView que añade relleno adicional al refrescar

Por lo tanto, estoy enfrentando un extraño problema al implementar RecyclerView en mi proyecto. Tengo un decorador personalizado para implementar un relleno superior e inferior consistente y un valor bastante diferente de relleno entre elementos. Cada vez que toco en la actualización, es decir, recuperar los datos de back-end y poblar RecyclerView de nuevo, el relleno aumenta y sigue aumentando en cada actualización.

Esta es la manera correcta

Cuando golpeo el refresco (haciendo AsyncTask para ejecutar otra vez), el espacio entre los artículos aumenta. Y se mantiene en aumento con cada actualización.

El relleno entre los artículos cada vez mayor

Tengo un RecyclerView típico como este

<android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="false" android:focusableInTouchMode="false"> </android.support.v7.widget.RecyclerView> 

El contenido de contenido dentro de RecyclerView es CardView con la siguiente disposición:

 <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/cv" android:layout_marginLeft="9dp" android:layout_marginRight="9dp" > <RelativeLayout android:id="@+id/itemLinearTop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingTop="17dp" android:paddingRight="10dp" android:paddingLeft="10dp"> <TextView android:id="@+id/tv1" android:textColor="@color/logo_black" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/tv2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/tv1" android:textColor="@color/logo_black" android:layout_alignParentRight="true" android:textAppearance="?android:attr/textAppearanceMedium" /> <!-- More elements --> </RelativeLayout> </android.support.v7.widget.CardView> 

Estoy inicializando y poblando RecyclerView como esto:

 // In PostExecute of AsyncTask RecyclerView rv = (RecyclerView) rootView.findViewById(R.id.recyclerview); RecycleViewAdapter adapter = new FuelPricesRecycleViewAdapter(data); rv.setAdapter(adapter); rv.addItemDecoration(new RecyclerViewItemDecoration(30, item_count - 1)); 

Y esto es lo que parece mi clase de RecyclerViewItemDecoration:

 public class RecyclerViewItemDecoration extends RecyclerView.ItemDecoration { private int space = 0; private int item_count = 0; private int ADDITIONAL_PADDING = 20; public RecyclerViewItemDecoration(int space, int item_count) { this.space = space; this.item_count = item_count; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { if(parent.getChildPosition(view) != item_count) outRect.bottom = space; // Add top margin only for the first item to avoid double space between items if(parent.getChildPosition(view) == 0) outRect.top = space + ADDITIONAL_PADDING; if(parent.getChildPosition(view) == item_count) outRect.bottom = space + ADDITIONAL_PADDING; } } 

¡Gracias por tu ayuda!

Usted tiene que quitar la decoración del artículo antes de reseting nuevos datos.

rv.removeItemDecoration(yourDecorator)

¡Déjame saber si funciona!

Está agregando Decoration cada vez que se carga recyclerview.

Utilice un indicador en su lugar:

 private flagDecoration = false; if(!flagDecoration) { rv.addItemDecoration(new RecyclerViewItemDecoration(30, item_count - 1)); flagDecoration = true; } 

Se enfrentó al mismo problema y lo resolvió colocando

 mLayoutManager = new LinearLayoutManager(current_activity); recyclerView.setLayoutManager(mLayoutManager); 

En el método onPreExecute() .

Sólo inténtalo si funciona

Yo estaba enfrentando el mismo problema, la mejor solución es hacer la decoración de su artículo mientras que usted está inicializando su gestor de diseño en el titular de la vista, esto resuelve el problema que está enfrentando ejemplo

 public class GridViewHolder extends ViewHolder { RecyclerView grid_list; public GridViewHolder(View v) { super(v); this.grid_list = (RecyclerView) v.findViewById(R.id.home_screen_item_grid_recycler_view); if (grid_list.getLayoutManager() == null) { RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(context, 4); grid_list.setLayoutManager(mLayoutManager); grid_list.addItemDecoration(new GridSpacingItemDecoration(4, 3, false)); } } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.