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)
Joe
sumber
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);
aga
sumber
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);
YuriK
sumber
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" />
Maurice
sumber
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);
}
Shirish Kamath
sumber
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));

}
katwal-Dipak
sumber
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);
Steve
sumber
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

iam_muqshid
sumber
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.

Ahlem Jarrar
sumber
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);
Ivars Briedis
sumber
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);
Abhinav Gupta
sumber
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;
rohegde7
sumber
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.

Jeanne vie
sumber
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);
ll
sumber
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;
}
Android Dev
sumber
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

David Kathoh
sumber
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'
Pooja
sumber
0

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

Sadique Khan
sumber
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

Yurii Mikhailichenko
sumber
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) `;

Nupoor
sumber
0

Saya mengalami masalah ini saat menggunakan Butterknife, saya menggunakan fragmen

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

Untuk Aktivitas ButterKnife.bind(this);

Anjana
sumber
-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.

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

sajid
sumber