recyclerview Nessun adattatore allegato; salta il layout

Ho appena implementato Recyclerview nel mio codice, sostituendo Listview.

Tutto funziona bene. Gli oggetti vengono visualizzati.

ma logcat dice 15:25:53.476 E/RecyclerView﹕ Nessun adattatore allegato; salta il layout

15:25:53.655 E/RecyclerView﹕ Nessun adattatore allegato; layout saltato

per il codice

ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

Come potete vedere ho allegato un adattatore per Recycleview. Quindi perché continuo a ricevere questo errore?

Ho letto altre domande relative allo stesso problema ma nessuna aiuta.

Soluzione

Puoi assicurarti che stai chiamando queste dichiarazioni dal thread "main" (per esempio dentro il metodo onCreate()). Non appena chiamo le stesse dichiarazioni da un metodo "delayed". Nel mio caso un ResultCallback, ottengo lo stesso messaggio.

Nel mio Frammento, chiamando il codice sottostante dall'interno di un metodo ResultCallback produce lo stesso messaggio. Dopo aver spostato il codice nel metodo onConnected() all'interno della mia app, il messaggio è sparito...

LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
list.setLayoutManager(llm);
list.setAdapter( adapter );
Commentari (9)

Stavo ricevendo gli stessi due messaggi di errore fino a quando non ho sistemato due cose nel mio codice:

(1) Per impostazione predefinita, quando si implementano metodi nel RecyclerView.Adapter genera:

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

Assicurati di aggiornare il tuo codice in modo che dica:

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

Ovviamente se hai zero oggetti nei tuoi oggetti allora avrai zero cose visualizzate sullo schermo.

(2) Non stavo facendo questo come mostrato nella risposta superiore: https://stackoverflow.com/questions/24503760/cardview-layout-width-match-parent-does-not-match-parent-recyclerview-width

//correct
LayoutInflater.from(parent.getContext())
            .inflate(R.layout.card_listitem, parent, false);

//incorrect (what I had)
LayoutInflater.from(parent.getContext())
        .inflate(R.layout.card_listitem,null);

(3) MODIFICA: BONUS: Assicurati anche di impostare la tua RecyclerView in questo modo:

NON così:

Ho visto alcuni tutorial che usano quest'ultimo metodo. Mentre funziona credo che generi anche questo errore.

Commentari (3)

Succede quando non si imposta l'adattatore durante la fase di creazione:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    ....
}

public void onResume() {
    super.onResume();
    mRecyclerView.setAdapter(mAdapter);
    ....
}

Basta spostare l'impostazione dell'adattatore in onCreate con un dato vuoto e quando hai la chiamata dei dati:

mAdapter.notifyDataSetChanged();
Commentari (1)