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


@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.


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.


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>

1

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

LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)

zamiast:

LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)

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" />

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.