Vista de reciclador que muestra un solo artículo


124

Me enfrento a un extraño error en el que la vista de reciclaje solo muestra un elemento. A continuación se muestra el código para mi adaptador de vista de reciclaje:

public class ChatAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {


List<chat> chats;
String username;
final int My=0,Their=1;

public ChatAdapter(List<chat> chats) {
    this.chats = chats;
    this.username = PushApp.getApp().getSPF().getStringData(Constants.ANAME);
}


@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RecyclerView.ViewHolder viewHolder;
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());

    switch (viewType) {
        case My:
            View v1 = inflater.inflate(R.layout.my_chat_child, parent, false);
            viewHolder = new MyChatHolder(v1);
            break;
        case Their:
            View v2 = inflater.inflate(R.layout.their_chat_child, parent, false);
            viewHolder = new TheirMessageHolder(v2);
            break;
        default:
            View v = inflater.inflate(R.layout.my_chat_child, parent, false);
            viewHolder = new MyChatHolder(v);
            break;
    }

    return viewHolder;

}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    switch (holder.getItemViewType()) {
        case My:
            MyChatHolder myChatHolder = (MyChatHolder) holder;
            myChatHolder.setMyMessage(chats.get(position).getMessage());
            break;

        case Their:
            TheirMessageHolder theirMessageHolder = (TheirMessageHolder) holder;
            theirMessageHolder.setTheirChat(chats.get(position).getFrom(), chats.get(position).getMessage());
            break;
    }
}

@Override
public int getItemViewType(int position) {
    if(username.equalsIgnoreCase(chats.get(position).getFrom()))
        return My;
    return Their;
}

@Override
public int getItemCount() {
    return chats.size();
}}

Ya he usado este código en otra aplicación y funciona perfectamente. He comprobado los datos de los chats, que también son perfectos.

Aquí hay un enlace a los archivos de diseño de repositorio git: archivos de diseño


@OShiffer He agregado el enlace de repositorio de git
Rujul1993


@Slavik ¡Gracias, funcionó!
Rujul1993

Respuestas:


419

No use la match_parentaltura para la vista de su artículo. Un elemento ocupa toda la pantalla verticalmente para que no vea otro.


43
Google, por favor agregue algunas advertencias de pelusa, ¡haga que su molesta pelusa sea útil esta vez!
Neon Warge

1
Oh, gracias, hombre impresionante, en mi caso creé un elemento con match_parent como altura. Por lo tanto, toda la pantalla se mantuvo detrás del primer elemento.
Naveed Ahmad

77
¡déjame comprarte un café! ¡Acabas de salvar mi cordura! ¡Gracias!
2017

No funciona para mi Todos los artículos se muestran solo si se Buttoncolocaron antes RecyclerView. ¿Alguna sugerencia?
Konstantin Konopko


17

cuando esté creando row.xml para la vista de reciclaje, debe seguir estas cosas:

  1. Utilice siempre "wrap_content" para la altura de la fila; de lo contrario, en "match_parent" ocupará toda la pantalla durante una sola fila.

  2. También puedes tomar la altura en dp.


1
tuve el mismo problema, intenté desplazarme y vi el resto de los elementos
Nixon Kosgei

1

Intente cambiar el diseño utilizado en la vista de elementos a FrameLayout. Aquí hay un ejemplo.

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/item"
    android:layout_width="match_parent"
    android:layout_height="?listPreferredItemHeight"
    android:clickable="true"
    android:focusable="true"
    android:foreground="?selectableItemBackground">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"/>
</FrameLayout>

1

Mi error fue que usé Accidantly:

LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)

en vez de:

LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)

0

1) si su vista de reciclaje es vertical, establezca también la altura de la vista de reciclaje match_parenty la row_item.xmlalturamatch_parent

2) si su vista de reciclaje es horizontal, configure el Ancho de vista de reciclaje match_parenty el row_item.xmlAncho tambiénmatch_parent

por ejemplo: - RecyclerView horizontal

<android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="60dp"
        android:layout_marginRight="60dp" />

row_item.xml

<TextView
android:layout_width="match_parent"
android:layout_height="180dp"
android:layout_marginBottom="5dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="5dp"
android:background="@drawable/rect"
android:gravity="center"
android:maxLines="2"
android:padding="10dp"
android:textColor="@color/white"
android:textSize="25sp" />

0

content_main.xml de la siguiente manera

android:layout_width="match_parent"
android:layout_height="match_parent"

EN el archivo row_list.xml realiza los siguientes cambios

android:layout_width="match_parent"
android:layout_height="wrap_content"

Hago los cambios anteriores que se ejecuta.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.