Vue du recycleur montrant un seul élément

125

Je suis confronté à une erreur étrange où recyclerview n'affiche qu'un seul élément. Voici le code de mon adaptateur 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();
}}

J'ai déjà utilisé ce code dans une autre application et cela fonctionne parfaitement. J'ai vérifié les données des chats qui sont également parfaites.

Voici le lien vers les fichiers de mise en page git repo: fichiers de mise en page

Rujul1993
la source
@OShiffer J'ai ajouté le lien git repo
Rujul1993
4
Essayez de définir wrap_contentau lieu de match_parentpour la hauteur et la largeur dans vos mises en page github.com/revic1993/androidchat/blob/master/app/src/main/res /
Slavik
@Slavik Merci, cela a fonctionné!
Rujul1993

Réponses:

420

Ne pas utiliser match_parentpour la hauteur de la vue de votre article. Un élément remplit tout l'écran verticalement pour que vous n'en voyiez pas un autre.

Slavik
la source
43
Google s'il vous plaît ajouter quelques avertissements de charpie, rendez votre charpie ennuyeuse utile cette fois!
Neon Warge
1
Oh merci, homme génial, dans mon cas, j'ai créé un élément avec match_parent comme hauteur. Par conséquent, tout l'écran a été conservé derrière le premier élément.
Naveed Ahmad
7
laissez-moi vous acheter un café! vous venez de sauver ma raison! merci!
microwth
Ça ne marche pas pour moi. Tous les éléments ne sont affichés que s'ils sont Buttonplacés avant RecyclerView. Aucune suggestion?
Konstantin Konopko
18

lorsque vous créez row.xml pour recyclerview, vous devez suivre les étapes suivantes:

  1. Utilisez toujours "wrap_content" pour la hauteur de la ligne sinon dans "match_parent", il occupera tout l'écran pour une seule ligne.

  2. Vous pouvez également prendre la hauteur en dp.

Abhishek Kumar
la source
1
J'ai eu le même problème, j'ai essayé de faire défiler et j'ai vu le reste des éléments
Nixon Kosgei
1

Essayez de changer la mise en page utilisée dans la vue de vos éléments en FrameLayout. Voici un exemple.

<?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>
Searene
la source
1

Mon erreur a été que j'ai utilisé accidentellement:

LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)

au lieu de:

LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
Uriel Frankel
la source
0

1) si votre vue de recyclage est verticale, réglez la hauteur de la vue de recyclage match_parentet la row_item.xmlhauteur égalementmatch_parent

2) si votre vue recyclée est horizontale, définissez également la largeur de la vue recyclée match_parentet la row_item.xmllargeurmatch_parent

par exemple: - 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" />
Gautam Surani
la source
0

content_main.xml comme suit

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

Le fichier IN row_list.xml apporte les modifications suivantes

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

Je fais ci-dessus les modifications qu'il exécute.

abc abc
la source