Je suis confronté à une erreur étrange où recyclerview affiche un seul élément. Vous trouverez ci-dessous 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 de discussions, ce qui est également parfait.
Voici le lien vers les fichiers de mise en page git repo: fichiers de mise en page
N'utilisez pas match_parent
pour la hauteur pour votre vue d'article. Un élément remplit tout l'écran verticalement pour ne pas en voir un autre.
lorsque vous créez row.xml pour recyclerview, procédez comme suit:
Utilisez toujours "wrap_content" pour la hauteur de la ligne, sinon dans "match_parent", il occupera tout l'écran pour une seule ligne.
Vous pouvez également prendre la hauteur en dp.
Essayez de changer la mise en page utilisée dans votre vue d'article 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>
1) si votre recyclerview est vertical, définissez la hauteur de recyclerview match_parent
et row_item.xml
height aussi match_parent
2) si votre recyclerview est horizontale, définissez la largeur de recyclerview match_parent
et row_item.xml
Width également match_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" />