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?
- RecyclerView.ViewHolder - getLayoutPosition vs getAdapterPosition
- ¿Existe una mejor manera de obtener una referencia a la RecyclerView padre desde el adaptador?
- ¿Cómo obtener la vista en RecyclerView.Adapter para Snackbar?
- Cómo crear un menú contextual para RecyclerView
- ¿Hay observadores escritos en RecyclerView.Adapter para saber si el conjunto de datos ha sido cambiado?
- Lista 2D con RecyclerView en HorizontalScrollView
- Las animaciones de elementos predictivos de RecyclerView no funcionan (APPEARING)
- RecyclerView no se desinscribe del adaptador en el cambio de orientación
- Implementar una vista ampliable Android Recycler con encabezados pegajosos, función de búsqueda, selector lateral alfabético y Swipable Items / tarjetas?
- RecyclerVista el espacio entre los elementos que se expanden al desplazarse
- ¿Cómo utilizar ItemAnimator en un RecyclerView?
- Lazy Loading no funciona correctamente
- Añadir espacio al final del 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