RecyclerView Adapter está repitiendo valores en lugares erróneos

Estoy mostrando 17 CardViews.

Estoy usando RecyclerView para lograr lo mismo.

Cada CardView muestra un dato común (formato).

Dependiendo de los datos recibidos de un archivo JSON, una tarjeta puede mostrar algunas filas adicionales. introduzca la descripción de la imagen aquí . La siguiente imagen muestra 2 CardViews (en foco) que muestran los datos adicionales, el resto muestra los datos comunes.

Aparece correctamente. Pero entonces cuando me desplazo abajo a la parte inferior de la visión, el último CardView no se supone para exhibir ninguna fila, pero copia uno de uno de los 2 que vimos en el acoplamiento antedicho y exhibe. [Puede publicar solo 2 enlaces por vez]

Luego me desplácese a la parte superior y copia las filas de ambos CardViews que estaban mostrando correctamente y repite aquí para las 2 primeras cartas, respectivamente: introduzca la descripción de la imagen aquí

¿Qué intenté?

  • Si otra cosa

Muchos problemas similares muestran una solución común. Una de esas respuestas está aquí. La cosa es que no sé qué condición aplicar y dónde. Este es mi código:

@Override public void onBindViewHolder(DataObjectHolder holder, final int position) { HashMap<Integer, ShoppingCartSummaryObject> dataItem = new HashMap<Integer, ShoppingCartSummaryObject>(); dataItem = mDataset.get(position); TextView textViewComment = holder.textViewComment; ShoppingCartSummaryObject obj = new ShoppingCartSummaryObject(); obj = (ShoppingCartSummaryObject) dataItem.get(position); holder.textViewPackageType.setText(obj.getPackageType()); holder.textViewPackageCode.setText(obj.getPackageCode()); holder.textViewPackageDesc.setText(obj.getPackageDesc()); params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); try { for (int i = 0; i < obj.getArrayListPart().size(); i++) { View view2 = LayoutInflater.from(mContext).inflate(R.layout.detailrow, null); holder.advPartDesc = (TextView) view2.findViewById(R.id.advPartDesc); holder.advPartnum = (TextView) view2.findViewById(R.id.advPartNum); cv = holder.cv; advisoryLayout = holder.advisoryLayout; empty = holder.empty; layoutPackageSummary = holder.layoutPackageSummary; holder.detailRow = (RelativeLayout) view2.findViewById(R.id.detailRow); rallyLayout = new RelativeLayout(mContext); rallyLayout.addView(holder.detailRow); cnt+=1; rallyLayout.setId(cnt); holder.layoutpartList.addView(rallyLayout); if (i == 0) { //for adding the first row below standard data params.addRule(RelativeLayout.BELOW, empty.getId() ); holder.advPartnum.setText(obj.getArrayListPart().get(i).partCode); holder.advPartDesc.setText(obj.getArrayListPart().get(i).partDesc); rallyLayout.setLayoutParams(params); } else { //for more than one rows, 2nd row appearing below 1st and 3rd below 2nd and so on params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.BELOW, cnt - 1); holder.advPartnum.setText(obj.getArrayListPart().get(i).partCode); holder.advPartDesc.setText(obj.getArrayListPart().get(i).partDesc); rallyLayout.setLayoutParams(params); } } } catch (Exception e) { e.printStackTrace(); } } 

y así es como intenté implementar las respuestas del enlace compartido:

 if(obj.getArrayListPart().size()>0) { /*added the if() condition*/ if (i == 0) { params.addRule(RelativeLayout.BELOW, empty.getId()); holder.advPartnum.setText(obj.getArrayListPart().get(i).partCode); holder.advPartDesc.setText(obj.getArrayListPart().get(i).partDesc); rallyLayout.setLayoutParams(params); } else { params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.BELOW, cnt - 1); holder.advPartnum.setText(obj.getArrayListPart().get(i).partCode); holder.advPartDesc.setText(obj.getArrayListPart().get(i).partDesc); rallyLayout.setLayoutParams(params); } } else { holder.advPartnum.setText("abc"); holder.advPartDesc.setText("abc"); } } } catch (Exception e) { e.printStackTrace(); } 

También agregué:

 @Override public long getItemId(int position) { return super.getItemId(position); } 

Nada funcionó.

Comprobé los datos de JSON, quité una matriz de la lista, e independientemente de la tarjeta que quito, también afecta la eliminación de los valores de la fila que se repiten de filas superiores / inferiores (cardviews), dependiendo de la tarjeta que miente entre la tarjeta con detalles y tarjeta en la parte superior / inferior. También probado:

 mAdapter.setHasStableIds(true); 

pero que simplemente omitió todos los datos adicionales de fila que aparecen debajo del estándar común.

Por favor ayuda. He proporcionado todo lo que he intentado.

Aquí está el código fuente que pidió xml

  <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" app:stackFromEnd="true" /> 

Actividad

  import android.graphics.Color; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.ArrayList; import java.util.List; import java.util.Random; import in.ashish29agre.calendar.R; public class RecyclerViewActivity extends AppCompatActivity { private List<Message> messages; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycler_view); MessagesAdapter adapter = initDefaultsAndGetADapter(); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setAdapter(adapter); } private MessagesAdapter initDefaultsAndGetADapter() { GradientDrawable fromDrawable = new GradientDrawable(); fromDrawable.setColor(Color.parseColor("#EC407A")); fromDrawable.setCornerRadius(16f); GradientDrawable toDrawable = new GradientDrawable(); toDrawable.setCornerRadius(16f); toDrawable.setColor(Color.parseColor("#64B5F6")); // toDrawable.getPaint().setStyle(Paint.Style.FILL_AND_STROKE); // toDrawable.getPaint().setStrokeWidth(1); messages = new ArrayList<>(); Random random = new Random(); Message message; for (int i = 0; i < 20; i++) { message = new Message(); int value = random.nextInt(2); if (value == Message.TYPE_FROM) { message.setMsgType(value); message.setContent("Other user says #" + i); message.setDrawable(fromDrawable); } else if (value == Message.TYPE_TO) { message.setMsgType(value); message.setContent("You are saying #" + i); message.setDrawable(toDrawable); } else { Log.e("TAG", "Oops"); } messages.add(message); } return new MessagesAdapter(messages); } private class MessagesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private List<Message> messages; public MessagesAdapter(List<Message> messages) { this.messages = messages; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == Message.TYPE_FROM) { View fromLayout = LayoutInflater.from(parent.getContext()).inflate(R.layout.from_layout_item, parent, false); return new OtherUserMessageHolder(fromLayout); } else if (viewType == Message.TYPE_TO) { View toLayout = LayoutInflater.from(parent.getContext()).inflate(R.layout.to_layout_item, parent, false); return new CurrentUserMessageHolder(toLayout); } else { throw new IllegalArgumentException("Invalid View type"); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof OtherUserMessageHolder) { configureOtherUserMessageHolder(holder, position); } else { configureCurrentUserMessageHolder(holder, position); } } private void configureCurrentUserMessageHolder(RecyclerView.ViewHolder holder, int position) { if (holder != null && holder instanceof CurrentUserMessageHolder) { CurrentUserMessageHolder currentUserMessageHolder = (CurrentUserMessageHolder) holder; currentUserMessageHolder.getToContentTv().setText(messages.get(position).getContent()); currentUserMessageHolder.getToContentTv().setBackground(messages.get(position).getDrawable()); } } private void configureOtherUserMessageHolder(RecyclerView.ViewHolder holder, int position) { if (holder != null && holder instanceof OtherUserMessageHolder) { OtherUserMessageHolder otherUserMessageHolder = (OtherUserMessageHolder) holder; otherUserMessageHolder.getFromContentTv().setText(messages.get(position).getContent()); otherUserMessageHolder.getFromContentTv().setBackground(messages.get(position).getDrawable()); } } @Override public int getItemCount() { return messages.size(); } @Override public int getItemViewType(int position) { return messages.get(position).getMsgType(); } private final class CurrentUserMessageHolder extends RecyclerView.ViewHolder { private TextView toContentTv; public CurrentUserMessageHolder(View itemView) { super(itemView); toContentTv = (TextView) itemView.findViewById(R.id.to_item_tv); } public TextView getToContentTv() { return toContentTv; } } private final class OtherUserMessageHolder extends RecyclerView.ViewHolder { private TextView fromContentTv; public OtherUserMessageHolder(View itemView) { super(itemView); fromContentTv = (TextView) itemView.findViewById(R.id.from_item_tv); } public TextView getFromContentTv() { return fromContentTv; } } } private class Message { private static final int TYPE_FROM = 0; private static final int TYPE_TO = 1; private int msgType; private CharSequence content; private Drawable drawable; public int getMsgType() { return msgType; } public void setMsgType(int msgType) { this.msgType = msgType; } public CharSequence getContent() { return content; } public void setContent(CharSequence content) { this.content = content; } public Drawable getDrawable() { return drawable; } public void setDrawable(Drawable drawable) { this.drawable = drawable; } } } 
  • SetCurrentItem en ViewPager no se desplaza inmediatamente en la posición correcta
  • GridView con desplazamiento horizontal
  • Restablecer la posición de TextView (desplazable) en la nueva carga de texto
  • Bootstrap 3 largo desplazamiento modal de fondo en Android
  • GridView con muchas imágenes da como resultado un desplazamiento lento / áspero
  • No se puede implementar el deslizamiento + comportamiento de desplazamiento en el panel deslizante con ListView en Android
  • Android: ¿Cómo obtener el actual desplazamiento X de RecyclerView?
  • Cómo desplazarse pantalla en android
  • Restablecer TextView vaya a la parte superior
  • ¿Cómo detener el desplazamiento en un Widget de Galería?
  • Desplazamiento automático en ExpandableListView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.