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?
- Android: ¿Cómo obtener el actual desplazamiento X de RecyclerView?
- Barra de desplazamiento no mostrada en RecyclerView
- Ancho del elemento RecyclerView layout_width = "match_parent" no coincide con el padre
- Taps rápidos (clics) en RecyclerView abre varios fragmentos
- Android: Actualización de recyclerview con nuevos datos
- Incrustación de anuncios en Recyclerview
- RecyclerView - No hay animación en NotifyItemInsert
- RecyclerView con GridLayoutManager y Picasso mostrando imagen incorrecta
- Deslizar un elemento a la vez
- Eliminar el espaciado predeterminado en la vista de reciclador
- Emitir refrescando una vista de una fila en recyclerview
- Android RecyclerView: Cambiar archivo de diseño LIST a GRID onOptionItemSelected
- Mostrar datos SQLite en RecyclerView
Me encontré con el mismo problema. Esto sucede debido a la función ViewHolderPattern.
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
- Conversión de la matriz JSON a POJO utilizando el mapeador de objetos jackson
- Android – Set Spinner Punto de inicio