Artículo de reciclaje

Si yo expande cualquier artículo en el recyclerview se expande muy bien pero cuando me despliegue hacia abajo el recylerview i encontró otros artículos también ampliado, debido al reciclaje tomó el tamaño ampliado no el original

public class FeedAdapter extends RecyclerView.Adapter<FeedAdapter.MyViewHolder> implements View.OnClickListener { private LayoutInflater inflater; private Context mcontext; private int mOriginalHeight = 0; private boolean mIsViewExpanded = false; public FeedAdapter(Context context) { inflater = LayoutInflater.from(context); mcontext = context; } @Override public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View view = inflater.inflate(R.layout.custom_row, viewGroup, false); MyViewHolder holder = new MyViewHolder(view); holder.frame.setOnClickListener(this); return holder; } @Override public void onBindViewHolder(MyViewHolder myViewHolder, int i) { } @Override public int getItemCount() { return 100; } @Override public void onClick(final View v) { if (mOriginalHeight == 0) { mOriginalHeight = v.getHeight(); } ValueAnimator valueAnimator; if (v.getHeight() < (mOriginalHeight + (int) (mOriginalHeight * 1.5))) { valueAnimator = ValueAnimator.ofInt(mOriginalHeight, mOriginalHeight + (int) (mOriginalHeight * 1.5)); } else { valueAnimator = ValueAnimator.ofInt(mOriginalHeight + (int) (mOriginalHeight * 1.5), mOriginalHeight); } valueAnimator.setDuration(300); valueAnimator.setInterpolator(new LinearInterpolator()); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { public void onAnimationUpdate(ValueAnimator animation) { Integer value = (Integer) animation.getAnimatedValue(); v.getLayoutParams().height = value.intValue(); v.requestLayout(); } }); valueAnimator.start(); } class MyViewHolder extends RecyclerView.ViewHolder { FrameLayout frame; public MyViewHolder(View itemView) { super(itemView); frame = (FrameLayout) itemView.findViewById(R.id.base); } } } 

Así que ¿cómo puedo solucionar eso y también hay una mejor manera de expandir y contraer los elementos?

Me encontré con el mismo problema. Esto sucede debido a la función ViewHolderPattern.

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html#isRecyclable%28%29

Android recicla la vista, independientemente de si se ha expandido o no. Así que dile a android que si tu vista se expande, no es reciclable.

En su clase ViewHolder añada:

 public MyViewHolder(View itemView) { super(itemView); frame = (FrameLayout) itemView.findViewById(R.id.base); frame.setTag(this); // to get a reference to viewholder later on } 

En el método OnClick, agregue:

 @Override public void onClick(final View v) { MyViewHolder holder = (MyViewHolder) v.getTag(); holder.setIsRecyclable(false); if (mOriginalHeight == 0) { mOriginalHeight = v.getHeight(); } ValueAnimator valueAnimator; ... } 

Esto debería solucionar tu problema. Recuerde ajustar "setIsRecyclable ()" de nuevo a true después de que la vista no se expanda más para que android pueda reciclarlo. Espero poder ayudar.

Aclamaciones

Florestan

  • Utilice ItemTouchHelper para deslizar-a-despedir con otra vista que se muestra detrás del barrido hacia fuera
  • FindFirstVisibleItemPositions no funciona para recycleview android
  • RecyclerView notifyItemInserted () La animación no se muestra cuando la posición es 0 pero funciona bien con otra posición
  • ¿Cómo guardar y restaurar la posición exacta de desplazamiento de RecyclerView?
  • StaggaredGridLayoutManager no funciona correctamente
  • ¿Cómo agregar un simple encabezado 8dp / pie de página a RecyclerView de Android?
  • Tipos incompatibles: no se puede emitir el visor a imageviewholder
  • Recyclerviews en ViewPager
  • Actualización parcial de RecyclerView.ViewHolder
  • Cómo superponer elementos en LinearLayoutManager - RecyclerView (como tarjetas de apilado)
  • Uso de CardView y RecyclerView en mis archivos de diseño genera una excepción
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.