RecyclerView Adapter está repitiendo valores en lugares erróneos
Estoy mostrando 17 CardViews.
Estoy usando RecyclerView para lograr lo mismo.
- Deshabilitar listview supercroll en samsung android
- El evento RecyclerView onScrollStateChanged / onScrolled no se activa cuando no se ha producido desplazamiento
- Recogida de basura GridView de Android (GC_EXTERNAL_ALLOC) <1K excesivamente, causando una interfaz de usuario muy intermitente
- Cómo guardar la posición de desplazamiento de RecyclerView en Android?
- Android personalizado listview muy lento al desplazarse
Cada CardView muestra un dato común (formato).
Dependiendo de los datos recibidos de un archivo JSON, una tarjeta puede mostrar algunas filas adicionales. . 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:
¿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.
- Casilla de verificación desmarcada cuando hago scrolllistview en Android
- OnGestureListener # onScroll no se llama desde GestureDetector en Samsung Galaxy Nota 10.1
- Que sería lo mejor para hacer una aplicación de desplazamiento horizontal en android?
- Emulador Android no Desplácese hacia abajo
- RecyclerView - ¿Cómo suavizar desplazamiento a la parte superior del elemento en una posición determinada?
- Desplazamiento sobre lienzo grande
- Cómo detectar Android ListView Scrolling se detuvo?
- Android ListView alpha scroller para desplazamiento rápido de larga lista
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; } } }
- Actualización de Android 6.0 que causa DB sqlite falla durante init
- Cambiar el nombre del documento de Google Drive mediante Android Storage Access Framework genera errores de permiso