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

  • Reciclado horizontal con bordes de decoloración
  • RecyclerView no se desplaza como se esperaba
  • RecyclerView: java.lang.IndexOutOfBoundsException: Inconsistencia detectada. Posición de artículo no válida
  • CardView dentro de RecyclerView tiene márgenes adicionales
  • Implementación diferente para un botón de acción flotante en cada fragmento de una actividad
  • ¿Cómo auto desplazarse hasta Recycler ver en Android?
  • Horizontalmente en RecyclerView (con GridLayoutManager)
  • Recyclerview addOnItemTouchListener obtiene la vista previa que se hace clic en la fila
  • Youtube Video no se muestra en RecyclerView
  • SwipeRefreshLayout está oculto en vacío RecyclerView
  • Quitar todos los artículos de RecyclerView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.