L'app si blocca durante il tentativo di utilizzare RecyclerView su Android 5.0


91

Sto cercando di fare confusione con il nuovo RecyclerView e ogni volta che provo a eseguirlo, la mia app si blocca immediatamente. Mi dà NullPointerException per aver tentato di accedere ai metodi da android.support.v7.widget.RecyclerView. Ho guardato altri post e ho visto che la maggior parte delle persone non lo aveva, compile 'com.android.support:recyclerview-v7:+'ma l'ho provato e non ha aiutato affatto. Non sono proprio sicuro di cosa fare a questo punto, qualsiasi aiuto sarebbe apprezzato. Qui il registro degli errori: (Vorrei pubblicare una foto ma non ho ancora 10 ripetizioni)

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)

per chiunque abbia questo errore causato dalle schede Viewpager vedere questa soluzione
Hassan Gilak

Hai risolto questo problema? Per favore aiuto, sto riscontrando lo stesso problema
Sagar

Ricordati di impostare / creare / registrare in onCreateViewciò che rimuovi / distruggi / annulla la registrazione in onDestroyView... Devi seguire quei cicli di vita!
Sakiboy

Risposte:


211

Questo problema si verifica in genere quando non è LayoutManagerstato fornito alcun file RecyclerView. Puoi farlo in questo modo:

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

14
Non penso che debba essere definitivo, quindi non credo che fosse questo il problema. Nel mio caso stavo implementando un frammento con recyclerView e ho provato solo a conservare un riferimento ad esso da onCreateView e impostare un layoutManager in seguito quando i dati vengono caricati. Ho avuto questo problema ed è andato via quando ho impostato il layoutManager in precedenza nel metodo onCreateView del gioco.
Nemanja Kovacevic

3
@ NemanjaKovačević beh, suppongo che ogni variabile che non deve essere modificata in seguito debba essere dichiarata come final, ecco perché l'ho dichiarata finalqui.
aga

2
Poiché LinearLayoutManager è verticale per impostazione predefinita, è possibile utilizzare: recyclerView.setLayoutManager (new LinearLayoutManager (context));
11

1
Grazie a Dio che possiamo Google gli stessi messaggi di errore che vengono creati da Google per dare loro un senso.
jhegedus

1
@wesleyfranks è difficile dire perché stai ottenendo un riferimento a un oggetto nullo senza guardare 1. il codice che imposta RecyclerView e 2. lo stacktrace che stai ottenendo dopo il crash. :)
aga

26

Nel mio caso non era collegato a "finale", ma al problema menzionato nel commento di @ NemanjaKovačević alla risposta di @aga. Stavo impostando un layoutManager sul caricamento dei dati e questa è stata la causa dello stesso arresto anomalo. Dopo aver spostato la configurazione di layoutManager su onCreateView del mio frammento, il problema è stato risolto.

Qualcosa come questo:

@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
Ancora una volta: non dico che questo problema sia in qualche modo correlato al fatto che la variabile non sia definitiva. Il problema è che LayoutManager non è stato fornito , questo è tutto. Puoi fare in modo che la variabile punti a LayoutManagerfinale o non finale: non cambia nulla.
aga

@Yurik sto usando recyclerview in Activity not on fragment. che caso per me?
Youri

@Youri dovresti semplicemente posizionare il setup di layoutManager nella onCreate della tua attività, credo.
YuriK

10

Per me, stavo avendo lo stesso problema, il problema era che c'era un RecyclerView inutilizzato in xml con la vista scomparsa ma non lo associo a nessun adattatore in Activity, da qui il problema. È stato risolto non appena ho rimosso tali visualizzazioni di riciclatore inutilizzate in xml

cioè - ho rimosso questa vista poiché non veniva richiamata nel codice o era stato impostato alcun adattatore

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

Lo stesso qui era tutto perfetto, ma non funzionava. Quindi ho rimosso i recyclerviews inutilizzati e ha funzionato senza problemi. Grazie amico @Maurice ^^
Bhupinder

1
dopo aver sprecato un giorno ho provato la tua soluzione e ha funzionato: D [:( il mio tempo si è sprecato]
mfaisalhyder

8

Ho sperimentato questo incidente anche se avevo RecyclerView.LayoutManagerimpostato correttamente. Ho dovuto spostare il RecyclerView codice di inizializzazione nella onViewCreated(...)richiamata per risolvere questo problema.

@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
Tuttavia, il mio problema non è stato risolto: / ho provato quasi tutte le soluzioni e ho ancora lo stesso errore quando si utilizza RecyclerView all'interno di un frammento da mostrare in PagerView :(
mfaisalhyder

Eccezionale! Spostamento del RecyclerViewcodice di inizializzazione nel onViewCreated(...) lavorato
Marcelo Gracietti

Ho fatto questa soluzione, ed era ancora nulla per me. Sto ancora cercando di capire dove.
wesley franks

5

È necessario utilizzare setLayoutManagernel RecyclerView#onCreate()metodo. Prima di aggiungere recyclerViewa una vista, deve avere il 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

Ho riscontrato questo problema a causa di un riferimento errato RecyclerViewdell'ID.

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

per

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

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

Verificare con l'ID della vista riciclatore, che punta alla visualizzazione effettiva del riciclatore ha risolto il mio problema


1

Il mio problema era nel mio lyout XML che ho un android: animateLayoutChanges impostato su true e ho chiamato notifyDataSetChanged () sull'adattatore di RecyclerView nel codice Java.

Quindi, l'ho appena rimosso android: animateLayoutChanges dal mio layout e questo ha risolto il mio problema.


1

Ho avuto questo problema durante l'utilizzo della libreria Butterknife. Avevo:

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

Ma la versione corretta è:

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

1

In Gradle implementa questa libreria:

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'

In XML menzionare in questo modo:

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

In Fragment usiamo in recyclerViewquesto modo:

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

In Activity usiamo in RecyclerViewquesto modo:

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

se hai bisogno di orizzontale RecyclerView fai questo:

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

se vuoi usare GridLayoutManager usando RecyclerViewusa in questo modo:

        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

Stavo usando un'iniezione di dipendenza - ButterKnife e questo problema è sorto perché non avevo vincolato la vista.

Quindi all'interno di onCreate () ho appena inserito questa riga:

ButterKnife.bind(this);

La mia dichiarazione RecyclerView con Dependency Injection:

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

1

Per coloro che utilizzano: implementazione "androidx.recyclerview: recyclerview: 1.1.0-beta05"

assicurati di usarlo nel tuo layout xml

Ho anche riscontrato un arresto anomalo durante l'esecuzione della mia app sotto l'API 27. Di seguito è riportato un collegamento al messaggio

In origine, ho creato uno stile per modificare la dimensione del carattere della mia visualizzazione di testo all'interno di recyclerview, ecco perché ho creato questo codice di seguito: (avrei potuto chiamare @dimen quando ho cambiato la dimensione del carattere in base alle dimensioni dello schermo)

All'interno di style.xml

e l'ho aggiunto nel mio tema

temi.xml

Dopo aver indagato, ho scoperto che questo è quello che mi ha causato un errore e dopo aver rimosso lo stile, non ho più riscontrato un arresto anomalo.

Ho provato tutte le possibili soluzioni che ho trovato qui in stack overflow e ho quasi rinunciato a questo, per fortuna nella mia curiosità ho pensato perché non rimuovere lo stile forse questo causa il crash e poi boom il crash è sparito.


1
Si prega di includere esempi di codice direttamente piuttosto che collegarli alle immagini. Dai un'occhiata alla sezione "Aiuta gli altri a riprodurre il problema": stackoverflow.com/help/how-to-ask
Chris B

1
Sono davvero per questo @ChrisB. Questa è la prima volta che metto un commento qui perché la mia reputazione è troppo bassa come puoi vedere. Ho riscontrato l'arresto anomalo oggi e stavo pensando di postare qui perché forse ci sono persone che stanno affrontando questo problema, in particolare stanno usando 'androidx.recyclerview: recyclerview: 1.1.0-beta05'.
Jeanne vie

0

Poiché LinearLayoutManager è verticale per impostazione predefinita, un modo più semplice per farlo è:

recyclerView.setLayoutManager(new LinearLayoutManager(context));

Se vuoi cambiare l'orientamento puoi usare questo costruttore:

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

avere uno strano manager di issulinearlayout ora. lo sto istanziando ma in ancora ge questo errore. mucca sacra.
filthy_wizard

0

Penso che il problema nel tuo Adapter. Assicurarsi che sei tornato ViewHolderin onCreateViewHolder(). Come di seguito:

@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

Per me il problema era con il mio activity_main.xml (21) in cui recycleView non aveva un 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"
    />

Ha funzionato quando ho aggiunto un Android: id = "@ + id / transac_recycler_view" a activity_main.xml (21) recycleView


0

Nel mio caso, ho aggiunto solo la libreria Butterknife e ho dimenticato di aggiungere annotationProcessor. Aggiungendo sotto la riga a build.gradle (modulo App), ho risolto il mio problema.

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

0

Recyclerview recylerview = findbyid (R.id.recyclerview) Forse te lo sei perso


Ciao, benvenuto in SO! Per favore, spiega ancora perché questo è rilevante per questa domanda. Come è attualmente scritto, è difficile dire a cosa ti riferisci.
Piotr Kamoda

0

Ho avuto un problema simile quando ho testato la mia applicazione su GenyMotion. Dopo il riavvio del dispositivo in GenyMotion il problema è stato risolto


0

Ho affrontato lo stesso problema perché avevo RecyclerView in un altro layout e non su activity_main.xml.

Cercando su alcuni siti ho ottenuto qualcosa e ho voluto condividere qui

  1. Aggiungi l'ID per includere il tag in Activity_main.xml

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

  2. chiamare questo layout prima di Searching view by ID in MainActivity.java

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

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


-1

Se io dove te lo farò. onView (withId (android.R.id.list)). perform (RecyclerViewActions.scrollToPosition (3)); android.R.id.list cambialo nel tuo ID elenco e la posizione sarà la tua posizione all'interno del tuo array.


-1

usando frammento

scrivere codice in onCreateView ()

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

utilizzando l'attività

scrivere codice in onCreate () RecyclerView recyVideo = findViewById (R.id.recyVideoFag);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.