Widok recyklera przedstawiający pojedynczy element

125

Mam do czynienia z dziwnym błędem, w którym widok recyklingu pokazuje tylko jeden element. Poniżej znajduje się kod mojego adaptera do recyklingu:

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

Użyłem już tego kodu w innej aplikacji i działa doskonale. Sprawdziłem dane czatów, które również są doskonałe.

Oto link do plików układu repozytorium git: pliki układu

Rujul1993
źródło
@OShiffer Dodałem link do repozytorium git
Rujul1993
4
Spróbuj ustawić wrap_contentzamiast match_parentwysokości i szerokości w swoich układach github.com/revic1993/androidchat/blob/master/app/src/main/res/ ... github.com/revic1993/androidchat/blob/master/app/src/main / res /…
Slavik
@Slavik Dzięki, że zadziałało!
Rujul1993

Odpowiedzi:

420

Nie używaj match_parentokreślenia wysokości w widoku przedmiotu. Jeden element wypełnia cały ekran w pionie, więc nie widać innego.

Slavik
źródło
43
Google, dodaj ostrzeżenia o kłaczkach, niech irytujące kłaczki będą przydatne tym razem!
Neon Warge,
1
Och, dzięki, niesamowity człowieku, w moim przypadku stworzyłem przedmiot z match_parent jako wysokością. Dlatego cały ekran znajdował się za pierwszym elementem.
Naveed Ahmad
7
kupię ci kawę! Właśnie uratowałeś mi zdrowie psychiczne! dzięki!
mikrowcześnie
Nie działa na mnie. Wszystkie elementy są wyświetlane tylko wtedy, gdy zostały Buttonumieszczone wcześniej RecyclerView. Jakieś sugestie?
Konstantin Konopko
18

podczas tworzenia row.xml dla recyclinglerview należy postępować zgodnie z następującymi wskazówkami:

  1. Zawsze używaj „wrap_content” jako wysokości wiersza, w przeciwnym razie w „match_parent” zajmie cały ekran w jednym wierszu.

  2. Możesz również wziąć wysokość w dp.

Abhishek Kumar
źródło
1
miałem ten sam problem, próbowałem przewijać i zobaczyłem resztę pozycji
Nixon Kosgei
1

Spróbuj zmienić układ używany w widoku przedmiotu na FrameLayout. Oto przykład.

<?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
źródło
1

Mój błąd polegał na tym, że przypadkowo użyłem:

LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)

zamiast:

LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
Uriel Frankel
źródło
0

1) jeśli widok recyklingu jest pionowy, ustaw wysokość widoku recyklingu match_parenti row_item.xmlrównież wysokośćmatch_parent

2) jeśli widok recyklingu jest poziomy, ustaw również Szerokość widoku recyklingu match_parenti row_item.xmlSzerokośćmatch_parent

na przykład: - Poziome 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
źródło
0

content_main.xml w następujący sposób

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

W pliku row_list.xml wprowadź następujące zmiany

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

Wprowadzam powyższe zmiany to działa.

abc abc
źródło