Recyclerview tidak memanggil onCreateViewHolder

150

Saya RecyclerViewtidak memanggil onCreateViewHolder, onBindViewHolderbahkan MenuViewHolderkonstruktor, karena itu tidak ada yang muncul di RecyclerView. Saya menaruh log untuk debugging, dan tidak ada log yang ditampilkan. Apa yang mungkin menjadi masalah?

Adaptor saya:

public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.MenuViewHolder> {
private LayoutInflater inflater;
List<Menu> data = Collections.emptyList();

public MenuAdapter(Context context, List<Menu> data) {
    Log.i("DEBUG", "Constructor");
    inflater = LayoutInflater.from(context);
    Log.i("DEBUG MENU - CONSTRUCTOR", inflater.toString());
    this.data = data;
    for(Menu menu: this.data){
        Log.i("DEBUG MENU - CONSTRUCTOR", menu.menu);
    }
}

@Override
public MenuViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.row_menu, parent, false);
    MenuViewHolder holder = new MenuViewHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(MenuViewHolder holder, int position) {
    Log.i("DEBUG MENU", "onBindViewHolder");
    Menu current = data.get(position);
    holder.title.setText(current.menu);
}

@Override
public int getItemCount() {
    return 0;
}

class MenuViewHolder extends RecyclerView.ViewHolder {
    TextView title;
    ImageView icon;

    public MenuViewHolder(View itemView) {
        super(itemView);
        title = (TextView) itemView.findViewById(R.id.menuText);
    }
}

XML baris khusus saya:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/menuText"
    android:text="Dummy Text"
    android:layout_gravity="center_vertical"
    android:textColor="#222"/>

dan Fragmen saya:

public NavigationFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mUserLearnedDrawer = Boolean.valueOf(readFromPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, "false"));
    if (savedInstanceState != null) {
        mFromSavedInstaceState = true;
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment

    View view = inflater.inflate(R.layout.fragment_navigation, container, false);
    RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.drawer_list);
    MenuAdapter adapter = new MenuAdapter(getActivity(), getData());
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setAdapter(adapter);
    return view;
}
Malinosqui
sumber
mengapa Anda mengatur recyclerView.setAdapter (adaptor); 2 kali?
Panayiotis Irakleous
Penyebab lain dari masalah ini adalah keliru membuat tata letak item cocok dengan ketinggian induk, sehingga hanya satu item yang ditampilkan pada satu waktu.
Joe Lapp
Dalam kasus saya bantu ini: invoicesRecyclerView.setHasFixedSize (true) invoicesRecyclerView.setLayoutManager (GridLayoutManager (ini, 1))
a_subscriber

Jawaban:

239

Anda getItemCountmetode returns 0. Jadi RecyclerViewjangan pernah mencoba untuk membuat tampilan. Buat itu mengembalikan sesuatu greater than 0.

sebagai contoh

@Override
public int getItemCount() {
    return data.size();
}
Konstantin Burov
sumber
25
oh astaga, aku merasa sangat bodoh sekarang! : facepalm: Terima kasih untuk ini!
Shinta S
3
Saya baru saja kehilangan satu jam untuk ini karena getItemCount jauh di bawah semua kode lain dan saya tidak melihatnya. : |
Joel
Saya memiliki adaptor khusus dan lupa untuk mengatur jumlah barang saya ke ukuran koleksi saya
Dooie
3
hitungan item saya 3 masih belum terlihat, Tidak ada titik debug masuk diBind atau onCreateHolder ... tapi itu ada di getItemCount
Dr. aNdRO
Oh man! Saya juga berjuang dengan ini untuk mencari tahu mengapa sih breakpoint saya tidak memukul dan sekarang saya tahu ... LOL! SIAL!!! TERIMA KASIH!
Vincy
409

Yang lain adalah pastikan Anda mengatur manajer tata letak ke RecyclerView:

recycler.setLayoutManager(new LinearLayoutManager(this));
Lay Leangsros
sumber
2
Saya kembali ke jawaban ini waaay terlalu sering ...
finki
42

saya lupa menambahkan baris di bawah ini setelah saya menambahkannya bekerja untuk saya

recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
Sai Gopi N
sumber
10
Bagaimana jawaban ini berbeda dari @ Lay Leangsros di atas satu jawaban?
Mehdi Dehghani
15

Ini tidak berlaku untuk kasus khusus Anda. Tapi ini mungkin bisa membantu orang lain.

Alasan ini bisa ceroboh menggunakan metode berikut

recyclerView.setHasFixedSize(true);

Jika tidak digunakan dengan hati-hati, ini dapat menyebabkan onBindViewdan onCreateViewHoldertidak dipanggil sama sekali, tanpa kesalahan dalam log.

venky
sumber
12

Silakan atur manajer tata letak RecyclerViewseperti kode di bawah ini:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view_right);
//set your recycler view adapter here
NavigationAdapter adapter = new NavigationAdapter(this, FragmentDrawer.getData());
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
Mandeep Yadav
sumber
9

Untuk apa nilainya, saya mengamatinya ketika saya mengatur adaptor tampilan pendaur ulang sebelum adaptor benar-benar diinisialisasi. Solusi adalah memastikan recyclerView.setAdapter(adapter)dipanggil dengan adaptor non-null

kip2
sumber
9

Saya sangat sangat berharap ini membantu seseorang suatu hari nanti. Saya hanya menghabiskan lebih dari satu jam untuk kacang yang satu ini!

Saya punya ini:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = adapter
        }

Ketika saya seharusnya memiliki ini:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = projectAdapter
        }

Karena saya bodoh memanggil adaptor saya adapter, itu dibayangi oleh adaptor tampilan pendaur ulang di blok berlaku! Saya mengganti nama adaptor ke projectAdapter untuk membedakannya dan masalah terpecahkan!

the_new_mr
sumber
6

Mengatur ketinggian TextViewdi dalam custom.xmlatau RecyclerView. Jika tinggi wrap-content, maka RecyclerViewtidak akan terlihat.

jian lang
sumber
Menghabiskan begitu banyak waktu untuk ini .. ketinggian tampilan pendaur ulang adalah nol. Ketika digunakan dalam suatu kegiatan, entah bagaimana itu berkembang sendiri. Dalam sebuah fragmen di dalam tata letak lain .. tidak
Asif Shiraz
4

Ini terjadi ketika saya RecyclerViewberada di dalam aScrollView dan saya menggunakan Android Support Library 23.0. Untuk memperbaikinya, saya memperbarui ke Perpustakaan Dukungan Android 23.2:

Dalam build.gradle:

dependencies {
    ...
    compile 'com.android.support:appcompat-v7:23.2.+'
    compile 'com.android.support:cardview-v7:23.2.+'
}
J Wang
sumber
4

Tambahkan ini ke Kelas Adaptor Anda

 @Override
    public int getItemCount() {
        return mDataset.size();
    } 
Brinda Rathod
sumber
juga, ini adalah duplikat
Ricardo A.
4

Mungkin ini membantu seseorang tetapi jika Anda mengatur visibilitas RecycleView Anda ke PERGI, metode adaptor tidak akan dipanggil sama sekali ... Butuh beberapa waktu untuk mengetahuinya.

garis pemisah, pemutus
sumber
luar biasa !!!!! ... tank begitu banyak ,,,
X-Black ...
3

Saya memiliki masalah yang sama, karena saya menggunakan android.support.constraint.ConstraintLayoutsumber daya tata letak. Berubah untuk FrameLayoutmembantu.

Teddy liar
sumber
Terima kasih atas solusinya. Adakah yang tahu mengapa ini berperilaku seperti ini jika induk Lihat android.support.constraint.ConstraintLayout?
Adrian Buciuman
2

Pilihan lain adalah jika Anda mengirim daftar ini dengan menggunakan get, verifikasi apakah Anda memiliki referensi yang benar, misalnya

private list<objetc> listObjetc;
//Incorrect
public void setListObjetcs(list<objetc> listObjetc){
  listObjetc = listObjetc;
}

//Correct
public void setListObjetcs(list<objetc> listObjetc){
  this.listObjetc = listObjetc;
}
David Hackro
sumber
2

Saya berjuang dengan masalah ini selama berjam-jam. Saya menggunakan sebuah fragmen. Dan masalahnya tidak mengembalikan view. Di bawah ini adalah kode saya:

ProductGridBinding binding = DataBindingUtil.inflate( inflater, R.layout.product_grid, container, false);



    mLinearLayoutManager = new LinearLayoutManager(getActivity());
    mLinearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);

    binding.rvNumbers.setHasFixedSize(true);
    binding.rvNumbers.setLayoutManager(mLinearLayoutManager);
    binding.rvNumbers.setAdapter(adapter);


    View view = binding.getRoot();


    return view;
TharakaNirmana
sumber
Kode aneh Variabel dan kelas ini sulit dipahami.
CoolMind
2

Lihat jawaban saya jika Anda menggunakan pustaka data mengikat Android - Pastikan Anda mengatur tata letak untuk daur ulang dan jumlah item harus lebih besar dari 0

 @BindingAdapter({"entries", "layout"})
    public static void setEntries(RecyclerView view, ArrayList<LoginResponse.User> listOfUsers, int layoutId) {
        if (view.getAdapter() == null) {
            view.setLayoutManager(new LinearLayoutManager(view.getContext()));
            SingleLayoutAdapter adapter = new SingleLayoutAdapter(layoutId) {
                @Override
                protected Object getObjForPosition(int position) {

                    return listOfUsers.get(position);
                }

                @Override
                public int getItemCount() {
                    return listOfUsers.size();
                }
            };
            view.setAdapter(adapter);
        }
    }

Selamat coding :-)

Bajrang Hudda
sumber
1

Dalam kasus saya, saya mengatur ID RecyclerView saya ke "recyclerView". Tampaknya ID ini sudah ditentukan di suatu tempat, karena ketika saya mengubahnya ke ID yang berbeda, metode dari adaptor dipanggil dengan benar.

Mateusz Wlodarczyk
sumber
1

Jika menggunakan adaptor khusus jangan lupa untuk mengatur ItemCount dengan ukuran koleksi Anda.

Dooie
sumber
1

Dalam kasus saya, ukuran daftar saya adalah 0 dan tidak memanggil metode onCreateViewHolder. Saya perlu menampilkan pesan di pusat untuk daftar kosong sebagai pengganti jadi saya melakukannya seperti ini dan itu berfungsi seperti pesona. Jawaban oleh @Konstantin Burov membantu.

  @Override
public int getItemCount() {
    if (contactList.size() == 0) {
        return 1;
    } else {
        return contactList.size();
    }
}
MRX
sumber
Ini bukan ide yang bagus. Lebih baik untuk mengatur visibilitas pesan kosong saat memasukkan data ke adaptor.
Jan
1

Encouter saya adalah metode overridid ​​onBindViewHolder (pemegang, posisi) dari RecyclerView.adaptor tidak dipanggil. Metode onCreateViewHolder dipanggil, getItemCount dipanggil. Jika Anda membaca spesifikasi untuk Recyclerview Adapter, Anda akan mengetahui bahwa jika Anda telah mengesampingkanBindViewHolder (pemegang, posisi, daftar payload) akan dipanggil. Jadi harap berhati-hati.

Yaojin
sumber
Bagaimana Anda memecahkan masalah tidak menelepon onBindViewHolder?
CoolMind
1

Jika Anda menempatkan wrap_content sebagai tinggi daftar Anda serta tinggi daftar item Anda, tidak ada yang akan muncul dan tidak ada fungsi recyclerView Anda yang akan dipanggil. Perbaiki ketinggian item atau masukkan match_parent untuk tinggi daftar. Itu memecahkan masalah saya.

Meriam
sumber
1

Kesalahan saya adalah menggembungkan tampilan yang salah di Fragment onCreateView.

Jeffrey
sumber
1

buka xml Anda. Dan ubah tata letak Anda untuk membungkus konten. Elemen yang satu menyembunyikan elemen berikutnya, sehingga metodenya tidak berfungsi!

Koala
sumber
1
Selamat datang di StackOverflow @koala !. Lihat ini. Bagaimana cara menulis jawaban yang baik di sini stackoverflow.com/help/how-to-answer
Shashin Bhayani
0

Tolong lakukan hal berikut

@Override
public int getItemCount() {
    return data.size();
}
Saurav Mir
sumber
0

Dalam kasus saya setelah mengubah Aktivitas untuk menggunakan ViewModel dan DataBinding, saya lupa menghapus setContentViewmetode pemanggilan dari onCreatemetode. Dengan menghapusnya masalah saya terpecahkan.

Siamak Ferdos
sumber
0

Bagi saya, itu karena setHasStableIds (true); metode telah ditetapkan. Hapus itu dan itu akan berhasil

Catalin
sumber
Tetapi metode ini tidak tampak dalam contoh minimal yang dapat direproduksi dalam pertanyaan. Jika menghapus petunjuk ini memperbaiki sesuatu, itu mungkin merupakan indikasi bug dalam pelaksanaan penampil tampilan atau mungkin pemberi notifikasi.
0

recyclerView.setAdapter (adaptor); disebut Daftar recyclerView diisi dengan memanggil metode.

Mesut Beysülen
sumber
0

Pastikan Anda XMLdan Koltin/Javakode cocok. Dalam kasus saya, saya memiliki masalah dengan ViewHoldersejak saya menulis:

var txt: AppCompatTextView = itemView.findViewById(R.id.txt)

Tetapi karena kode XML saya adalah:

<TextView
        android:id="@+id/txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        .../>

Saya harus mengubah baris sebelumnya menjadi:

var txt: TextView = itemView.findViewById(R.id.txt)

Selain itu, saya juga harus menghapus:

recyclerView.setHasFixedSize(true);

Semoga ini bisa membantu Anda :)

Mattia Ferigutti
sumber
0

Dalam kasus saya, saya kehilangan panggilan notifyDataSetChanged()setelah mengatur daftar dalam adaptor.

public void setUserList(List<UserList> userList) {
      this.userList = userList;
        notifyDataSetChanged();
}
nkadu1
sumber
0

Dalam kasus saya, saya kehilangan untuk mengatur orientasi di LinearLayout saya.

Setelah menambahkan masalah orientasi diperbaiki.

 android:orientation="vertical"
Ranjith Kumar
sumber
0

Masalah saya adalah layout_heightdan layout_widthdari RecyclerView diatur ke 0dp.

Zezi Reeds
sumber