Aplikasi mengalami error saat mencoba menggunakan RecyclerView di Android 5.0


91

Saya mencoba mengacaukan RecyclerView baru dan setiap kali saya mencoba menjalankannya, aplikasi saya langsung macet. Ini memberi saya NullPointerException karena mencoba mengakses metode dari android.support.v7.widget.RecyclerView. Saya telah melihat posting lain dan melihat bahwa kebanyakan orang tidak memilikinya compile 'com.android.support:recyclerview-v7:+'tetapi saya mencobanya dan itu tidak membantu sama sekali. Tidak begitu yakin apa yang harus dilakukan saat ini, bantuan apa pun akan dihargai. Berikut log kesalahannya: (Saya akan memposting gambar tetapi saya belum memiliki 10 repetisi)

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView$LayoutManager.onMeasure(android.support.v7.widget.RecyclerView$Recycler, android.support.v7.widget.RecyclerView$State, int, int)' on a null object reference
        at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:1764)
        at android.view.View.measure(View.java:17430)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
        at android.view.View.measure(View.java:17430)
        at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:851)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1166)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1372)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5786)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
        at android.view.Choreographer.doCallbacks(Choreographer.java:580)
        at android.view.Choreographer.doFrame(Choreographer.java:550)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)

bagi siapa saja yang memiliki kesalahan ini yang disebabkan oleh tab Viewpager, lihat solusi
Hassan Gilak

Sudahkah Anda memecahkan masalah ini?. Tolong bantu Saya mengalami masalah yang sama
Sagar

Ingatlah untuk mengatur / membuat / mendaftarkan onCreateViewapa yang Anda hapus / hancurkan / batalkan pendaftaran di onDestroyView... Harus mengikuti siklus hidup itu!
Sakiboy

Jawaban:


211

Masalah ini biasanya terjadi jika tidak LayoutManagerdisediakan untuk RecyclerView. Anda bisa melakukannya seperti ini:

final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);

14
Saya tidak berpikir itu perlu final jadi saya tidak berpikir itu masalahnya. Dalam kasus saya, saya mengimplementasikan fragmen dengan recyclerView dan saya hanya mencoba mempertahankan referensi ke sana dari onCreateView dan menyetel layoutManager nanti saat data dimuat. Saya mengalami masalah ini dan itu hilang ketika saya telah mengatur layoutManager sebelumnya di metode onCreateView gamein.
Nemanja Kovacevic

3
@ NemanjaKovačević yah, saya kira setiap variabel yang tidak perlu diubah nanti harus dideklarasikan sebagai final, itulah mengapa saya mendeklarasikannya di finalsini.
aga

2
Karena LinearLayoutManager vertikal secara default, Anda dapat menggunakan: recyclerView.setLayoutManager (new LinearLayoutManager (konteks));
Akan

1
Alhamdulillah kami dapat Google pesan kesalahan yang sama yang dibuat oleh Google untuk memahaminya.
jhegedus

1
@wesleyfranks sulit untuk mengatakan mengapa Anda mendapatkan referensi objek null tanpa melihat 1. kode yang mengatur RecyclerView dan 2. stacktrace yang Anda dapatkan setelah crash. :)
aga

26

Dalam kasus saya, itu tidak terkait dengan 'final', tetapi ke masalah yang disebutkan dalam komentar @ NemanjaKovačević ke jawaban @aga. Saya menyetel layoutManager pada pemuatan data dan itu adalah penyebab error yang sama. Setelah memindahkan penyiapan layoutManager ke onCreateView dari fragmen saya, masalah telah diperbaiki.

Sesuatu seperti ini:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
{
...
mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler);

mLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(mLayoutManager);

1
Sekali lagi: Saya tidak mengatakan bahwa masalah ini entah bagaimana terkait dengan variabel yang tidak final. Masalahnya adalah LayoutManager itu tidak disediakan , itu saja. Anda dapat membuat variabel mengarah ke LayoutManagerfinal, atau bukan final - itu tidak mengubah apa pun.
aga

@Yurik saya menggunakan recyclerview dalam Aktivitas bukan di fragmen. bagaimana dengan saya?
Youri

@Youri Anda hanya perlu menempatkan penyiapan layoutManager ke dalam onCreate aktivitas Anda, saya rasa.
YuriK

10

Bagi saya, saya mengalami masalah yang sama, masalahnya adalah ada RecyclerView yang tidak digunakan di xml dengan tampilan hilang tetapi saya tidak mengikatnya ke adaptor apa pun dalam Aktivitas, oleh karena itu masalahnya. Itu diselesaikan segera setelah saya menghapus tampilan pendaur ulang yang tidak digunakan di xml

yaitu - Saya menghapus tampilan ini karena ini tidak disebut dalam kode atau adaptor apa pun telah disetel

<android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/rv_profileview_allactivities"
        android:visibility="gone" />

Sama di sini semuanya sempurna, tetapi tidak berhasil. Jadi saya menghapus recyclerviews yang tidak digunakan dan berfungsi tanpa masalah apa pun. Thanks man @Maurice ^^
Bhupinder

1
setelah membuang waktu sehari saya mencoba solusi Anda dan berhasil: D [:( waktu saya terbuang percuma]
mfaisalhyder

8

Saya mengalami crash ini meskipun saya telah RecyclerView.LayoutManagermengatur dengan benar. Saya harus memindahkan RecyclerView kode inisialisasi ke onViewCreated(...)callback untuk memperbaiki masalah ini.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_listing, container, false);
    rootView.setTag(TAG);
    return inflater.inflate(R.layout.fragment_listing, container, false);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

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

    mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());
    mRecyclerView.setLayoutManager(mLayoutManager);

    mAdapter = new ListingAdapter(mListing);
    mRecyclerView.setAdapter(mAdapter);
}

2
Namun, masalah saya belum terselesaikan: / saya mencoba hampir setiap solusi dan masih mendapatkan kesalahan yang sama saat menggunakan RecyclerView di dalam fragmen untuk ditampilkan di PagerView :(
mfaisalhyder

Hebat! Memindahkan RecyclerViewkode inisialisasi ke dalam onViewCreated(...) pekerjaan
Marcelo Gracietti

Saya melakukan solusi ini, dan itu masih nol untuk saya. Masih mencoba mencari tahu di mana.
wesley franks

5

Anda perlu menggunakan setLayoutManagerdalam RecyclerView#onCreate()metode. Sebelum menambahkan recyclerViewke tampilan, itu harus memiliki LayoutManagerset.

 private RecyclerView menuAsList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    menuAsList = (RecyclerView) findViewById(R.id.recyclerView_mainMenu);
    menuAsList.setLayoutManager(new LinearLayoutManager(Home.this));

}

3

Saya mendapat masalah ini karena referensi RecyclerViewid yang salah.

recyclerView = (RecyclerView) findViewById(R.id.rv_followers_list);

untuk

recyclerView = (RecyclerView) findViewById(R.id.rv_search_list);

2
recyclerView =
            (RecyclerView) findViewById(R.id.recycler_view2);

Periksa dengan Anda ID tampilan pendaur ulang, menunjuk ke tampilan pendaur ulang yang sebenarnya memecahkan masalah saya


1

Masalah saya adalah di XML lyout saya, saya memiliki android: animateLayoutChanges disetel ke true dan saya telah memanggil notifyDataSetChanged () pada adaptor RecyclerView dalam kode Java.

Jadi, saya baru saja menghapus android: animateLayoutChanges dari layout saya dan itu memperbaiki masalah saya.


1

Saya mengalami masalah ini saat menggunakan perpustakaan Butterknife. Saya punya:

View rootView = inflater.inflate
                (R.layout.fragment_recipe_detail_view, container, false);
ButterKnife.bind(rootView);

Tapi versi yang benar adalah:

View rootView = inflater.inflate
                (R.layout.fragment_recipe_detail_view, container, false);
ButterKnife.bind(this, rootView);

1

Dalam Gradle, implementasikan pustaka ini:

implementation 'com.android.support:appcompat-v7:SDK_VER'
implementation 'com.android.support:design:SDK_VER'
implementation 'com.android.support:support-v4:SDK_VER'
implementation 'com.android.support:support-v13:SDK_VER'
implementation 'com.android.support:recyclerview-v7:SDK_VER'

Dalam XML sebutkan seperti ini:

<android.support.v7.widget.RecyclerView
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:id="@+id/recyclerView"/>

Dalam Fragmen kami menggunakan recyclerViewseperti ini:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
       View rootView = inflater.inflate(R.layout.YOUR_LAYOUT_NAME, container, false);

       RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(layoutManager);
        APICallMethod();
        YOURADAPTER = new YOURADAPTER(getActivity(), YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
        recyclerView.setAdapter(YOURADAPTER);
        return rootView;
    }

Dalam Aktivitas kami menggunakan RecyclerViewseperti ini:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.YOUR_LAYOUT_NAME);

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(layoutManager);
        APICallMethod();
        YOURADAPTER = new YOURADAPTER(ACTIVITY_NAME.this, YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
        recyclerView.setAdapter(YOURADAPTER);
   }

jika Anda membutuhkan horizontal RecyclerView lakukan ini:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(layoutManager);
        APICallMethod();
        YOURADAPTER = new YOURADAPTER(ACTIVITY_NAME.this, YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
        recyclerView.setAdapter(YOURADAPTER);

jika Anda ingin menggunakan GridLayoutManager menggunakan RecyclerViewpenggunaan seperti ini:

        RecyclerView recyclerView = findViewById(R.id.rvNumbers);
        recyclerView.setLayoutManager(new GridLayoutManager(this, 3)); // 3 is number of columns.
        adapter = new MyRecyclerViewAdapter(this, data);
        recyclerView.setAdapter(adapter);

1

Saya menggunakan Injeksi Ketergantungan - ButterKnife dan masalah ini muncul karena saya tidak mengikat tampilan.

Jadi di dalam onCreate () saya baru saja memasukkan baris ini:

ButterKnife.bind(this);

Deklarasi RecyclerView saya dengan Dependency Injection:

@BindView(R.id.recyclerview)
RecyclerView recyclerView;

1

Bagi mereka yang menggunakan: implementasi 'androidx.recyclerview: recyclerview: 1.1.0-beta05'

pastikan Anda menggunakan ini dalam tata letak xml Anda

Saya juga mengalami crash saat menjalankan aplikasi saya di bawah API 27. Berikut link ke pesan tersebut

Awalnya, saya telah membuat gaya untuk mengubah ukuran font textview saya di dalam recyclerview, itulah mengapa saya membuat kode ini di bawah ini: (Saya bisa saja memanggil @dimen saat mengubah ukuran font berdasarkan ukuran layar)

Di dalam style.xml

dan menambahkan ini di tema saya

themes.xml

Setelah menyelidiki, saya menemukan bahwa inilah yang menyebabkan kesalahan dan setelah menghapus gaya, saya tidak lagi mengalami crash.

Saya mencoba semua solusi yang mungkin saya temukan di sini di stack overflow dan hampir menyerah dalam hal ini, untungnya dalam keingintahuan saya, saya berpikir mengapa tidak menghapus gaya mungkin ini menyebabkan crash dan kemudian boom crash hilang.


1
Harap sertakan contoh kode secara langsung daripada menautkan ke gambar. Lihat bagian "Bantu orang lain mereproduksi masalah": stackoverflow.com/help/how-to-ask
Chris B

1
Saya benar-benar untuk @ChrisB ini. Ini adalah pertama kalinya saya memberi komentar di sini karena reputasi saya terlalu rendah seperti yang Anda lihat. Saya mengalami crash hari ini dan saya berpikir untuk memposting di sini karena mungkin ada orang yang juga menghadapi ini terutama mereka menggunakan 'androidx.recyclerview: recyclerview: 1.1.0-beta05'.
Jeanne bersaing

0

Karena LinearLayoutManager vertikal secara default, cara yang lebih mudah untuk melakukannya adalah:

recyclerView.setLayoutManager(new LinearLayoutManager(context));

Jika Anda ingin mengubah orientasi, Anda dapat menggunakan konstruktor ini:

public LinearLayoutManager(Context context, int orientation, boolean reverseLayout);

memiliki manajer tata letak issulin yang aneh sekarang. im instantiating itu tetapi masih ge kesalahan ini. Astaga.
filthy_wizard

0

Saya pikir masalah di Adapter. Pastikan Anda telah kembali ViewHolderdi onCreateViewHolder(). Seperti dibawah ini:

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v;
    v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_leaderboard, parent, false);
    ViewHolder view_holder = new ViewHolder(v);
    return view_holder;
}

0

Bagi saya masalahnya ada pada activity_main.xml (21) saya di mana recycleView tidak memiliki id.

activity_main.xml (21)

 <android.support.v7.widget.RecyclerView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginRight="8dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/button3"
    tools:listitem="@layout/transaction_list_row" />

activity_main.xml

<android.support.v7.widget.RecyclerView

    android:id="@+id/transac_recycler_view"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginRight="8dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/button3"
    />

Ini berfungsi ketika saya menambahkan android: id = "@ + id / transac_recycler_view" ke activity_main.xml (21) recycleView


0

Dalam kasus saya, saya hanya menambahkan perpustakaan butterknife dan lupa menambahkan annotationProcessor. Dengan menambahkan baris di bawah ini ke build.gradle (modul App), memecahkan masalah saya.

    annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'

0

Recyclerview recylerview = findbyid (R.id.recyclerview) Mungkin Anda melewatkannya


Hai, selamat datang di SO! Tolong jelaskan lagi mengapa ini relevan untuk pertanyaan ini. Seperti yang saat ini ditulis, sulit untuk mengatakan apa yang Anda maksud.
Piotr Kamoda

0

Saya mengalami masalah yang sama saat menguji aplikasi saya di GenyMotion. Setelah restart perangkat di GenyMotion masalah terpecahkan


0

Saya menghadapi masalah yang sama karena saya memiliki RecyclerView di layout lain dan bukan di activity_main.xml.

Dengan mencari di beberapa situs, saya mendapatkan sesuatu dan ingin berbagi di sini

  1. Tambahkan Id untuk Menyertakan tag di Activity_main.xml

    <include id="includedRecyclerLayout" .... </include>

  2. panggil layout ini sebelum Mencari tampilan berdasarkan ID di MainActivity.java

    `ConstraintLayout IncludedLayout = findViewById (R.id.inckudedRecyclerLayout);

    RecyclerViewrecyclerview = termasukLayout.findViewById (R.id.RECYCLER_VIEW_ID) `;


0

Saya mengalami masalah ini saat menggunakan Butterknife, saya menggunakan fragmen

Untuk Fragmen, seharusnya begitu ButterKnife.bind(this,view);

Untuk Aktivitas ButterKnife.bind(this);


-1

Jika saya di mana Anda saya akan melakukan ini. onView (withId (android.R.id.list)). perform (RecyclerViewActions.scrollToPosition (3)); android.R.id.list ubah ke id daftar Anda dan posisi akan menjadi posisi Anda di dalam array Anda.


-1

menggunakan fragmen

menulis kode di onCreateView ()

RecyclerView recyVideo = view.findViewById (R.id.recyVideoFag);

menggunakan aktivitas

menulis kode di onCreate () RecyclerView recyVideo = findViewById (R.id.recyVideoFag);

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.