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

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

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

2
Saya kembali ke jawaban ini waaay terlalu sering ...
finki


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.


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

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


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!


6

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


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.+'
}

4

Tambahkan ini ke Kelas Adaptor Anda

 @Override
    public int getItemCount() {
        return mDataset.size();
    } 

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.


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.


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

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;

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 :-)


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.


1

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


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

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.


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.


1

Kesalahan saya adalah menggembungkan tampilan yang salah di Fragment onCreateView.


1

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


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

0

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


0

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


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.


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 :)


0

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

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

0

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

Setelah menambahkan masalah orientasi diperbaiki.

 android:orientation="vertical"

0

Masalah saya adalah layout_heightdan layout_widthdari RecyclerView diatur ke 0dp.

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.