Recycler-Ansicht mit einem einzelnen Artikel


124

Ich habe einen seltsamen Fehler, bei dem in recyclerview nur ein einziger Artikel angezeigt wird. Unten ist der Code für meinen Recyclerview-Adapter:

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

Ich habe diesen Code bereits in einer anderen App verwendet und er funktioniert einwandfrei. Ich habe die Chat-Daten überprüft, was auch perfekt ist.

Hier ist der Link zu Git-Repo-Layoutdateien: Layoutdateien


@ OShiffer Ich habe den Git Repo Link hinzugefügt
Rujul1993


@Slavik Danke es hat funktioniert!
Rujul1993

Antworten:


419

Nicht match_parentfür die Höhe Ihrer Artikelansicht verwenden. Ein Element füllt den gesamten Bildschirm vertikal aus, sodass Sie kein anderes sehen.


43
Google, bitte fügen Sie einige Flusenwarnungen hinzu. Machen Sie Ihre nervigen Flusen diesmal nützlich!
Neon Warge

1
Oh, danke, großartiger Mann, in meinem Fall habe ich ein Element mit match_parent als Höhe erstellt. Daher wurde der gesamte Bildschirm hinter dem ersten Element gehalten.
Naveed Ahmad

7
Lass mich dir einen Kaffee kaufen! Du hast gerade meine geistige Gesundheit gerettet! Danke!
Mikrowelle

Funktioniert bei mir nicht Alle Artikel werden nur angezeigt, wenn Buttonsie zuvor platziert wurden RecyclerView. Irgendwelche Vorschläge?
Konstantin Konopko


17

Wenn Sie row.xml für recyclerview erstellen, sollten Sie folgende Schritte ausführen:

  1. Verwenden Sie immer "wrap_content" für die Höhe der Zeile, da sonst in "match_parent" der gesamte Bildschirm für eine einzelne Zeile belegt wird.

  2. Sie können die Höhe auch in dp angeben.


1
Ich hatte das gleiche Problem versucht zu scrollen und sah den Rest der Elemente
Nixon Kosgei

1

Versuchen Sie, das in Ihrer Elementansicht verwendete Layout in zu ändern FrameLayout. Hier ist ein Beispiel.

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

Mein Fehler war, dass ich versehentlich benutzt habe:

LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)

anstatt:

LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)

0

1) Wenn Ihre Recyclingansicht vertikal ist, stellen Sie die Höhe der Recyclingansicht match_parentund die row_item.xmlHöhe ebenfalls einmatch_parent

2) Wenn Ihre Recyclingansicht horizontal ist, stellen Sie die Breite der Recyclingansicht match_parentund die row_item.xmlBreite ebenfalls einmatch_parent

Zum Beispiel: - Horizontal RecyclerView

<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 wie folgt

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

In der Datei row_list.xml werden folgende Änderungen vorgenommen

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

Ich mache oben Änderungen, die es läuft.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.