Vista riciclatore che mostra un singolo articolo


124

Sto riscontrando uno strano errore in cui recyclerview mostra solo un singolo articolo. Di seguito è riportato il codice per il mio adattatore recyclerview:

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();
}}

Ho già utilizzato questo codice in altre app e funziona perfettamente. Ho controllato i dati delle chat che sono anche perfetti.

Ecco il collegamento ai file di layout del repository git: file di layout


@OShiffer Ho aggiunto il link git repo
Rujul1993

4
Prova a impostare wrap_contentinvece di match_parentper altezza e larghezza nei tuoi layout github.com/revic1993/androidchat/blob/master/app/src/main/res/… github.com/revic1993/androidchat/blob/master/app/src/main / res /…
Slavik

@Slavik Grazie ha funzionato!
Rujul1993

Risposte:


419

Non utilizzare match_parentper l'altezza per la visualizzazione dell'elemento. Un elemento riempie l'intero schermo verticalmente in modo da non vederne un altro.


43
Google, per favore, aggiungi alcuni avvisi di lanugine, rendi utile la tua fastidiosa lanugine questa volta!
Neon Warge

1
Oh grazie, uomo fantastico, nel mio caso ho creato un oggetto con match_parent come altezza. Quindi tutto lo schermo è stato mantenuto dietro il primo oggetto.
Naveed Ahmad

7
lascia che ti offra un caffè! hai appena salvato la mia sanità mentale! grazie!
microwth

Non funziona per me. Tutti gli elementi vengono visualizzati solo se Buttonposizionati prima RecyclerView. Eventuali suggerimenti?
Konstantin Konopko


17

quando crei row.xml per recyclerview dovresti seguire queste cose:

  1. Usa sempre "wrap_content" per l'altezza della riga altrimenti in "match_parent" occuperà l'intero schermo per una singola riga.

  2. Puoi anche prendere l'altezza in dp.


1
Ho avuto lo stesso problema ho provato a scorrere e ho visto il resto degli articoli
Nixon Kosgei

1

Prova a cambiare il layout utilizzato nella visualizzazione degli elementi in FrameLayout. Ecco un esempio.

<?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

Il mio errore è stato che ho usato accidentalmente:

LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)

invece di:

LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)

0

1) se la tua vista del riciclaggio è verticale, imposta anche l'altezza della vista del riciclaggio match_parente l' row_item.xmlaltezzamatch_parent

2) se il tuo recyclerview è orizzontale, imposta anche la larghezza del recyclerview match_parente la row_item.xmllarghezzamatch_parent

ad esempio: - RecyclerView orizzontale

<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 come segue

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

NEL file row_list.xml apportare le seguenti modifiche

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

Apporto le modifiche sopra che viene eseguito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.