Tampilan Recycler menampilkan satu item


124

Saya menghadapi kesalahan aneh dimana recyclerview hanya menampilkan satu item. Di bawah ini adalah kode untuk adaptor recyclerview saya:

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

Saya telah menggunakan kode ini di aplikasi lain dan berfungsi dengan sempurna. Saya telah memeriksa data obrolan yang juga sempurna.

Berikut link ke file layout git repo: file layout


@OShiffer Saya telah menambahkan tautan git repo
Rujul1993


@Slavik Terima kasih itu berhasil!
Rujul1993

Jawaban:


419

Jangan gunakan match_parentketinggian untuk tampilan item Anda. Satu item memenuhi seluruh layar secara vertikal sehingga Anda tidak melihat yang lain.


43
Google harap tambahkan beberapa peringatan Lint, buatlah lint Anda yang mengganggu kali ini!
Neon Warge

1
Oh Terima kasih, pria yang luar biasa, dalam kasus saya, saya membuat item dengan match_parent sebagai tinggi. Oleh karena itu, semua layar disimpan di belakang item pertama.
Naveed Ahmad

7
biarkan aku membelikanmu kopi! kamu baru saja menyelamatkan kewarasanku! terima kasih!
Microwth

Tidak berhasil untuk saya. Semua item hanya ditampilkan jika Buttonditempatkan sebelumnya RecyclerView. Ada saran?
Konstantin Konopko


17

saat Anda membuat row.xml untuk recyclerview harus mengikuti hal-hal berikut:

  1. Selalu gunakan "wrap_content" untuk tinggi baris, jika tidak dalam "match_parent", ini akan menempati seluruh layar untuk satu baris.

  2. Anda juga dapat mengukur ketinggian dalam dp.


1
saya memiliki masalah yang sama mencoba menggulir dan melihat item lainnya
Nixon Kosgei

1

Coba ubah tata letak yang digunakan dalam tampilan item Anda menjadi FrameLayout. Berikut ini contohnya.

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

Kesalahan saya adalah saya sengaja digunakan:

LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)

dari pada:

LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)

0

1) jika recyclerview Anda vertikal maka atur juga ketinggian match_parentdan row_item.xmlketinggian recyclerviewmatch_parent

2) jika recyclerview Anda horizontal maka atur Lebar recyclerview match_parentdan row_item.xmljuga Lebarmatch_parent

misalnya: - 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 sebagai berikut

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

IN file row_list.xml buat perubahan berikut

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

Saya membuat perubahan di atas itu berjalan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.