Recyclerview non chiama onCreateViewHolder


150

Il mio RecyclerViewnon chiama onCreateViewHolder, onBindViewHoldernemmeno il MenuViewHoldercostruttore, quindi non appare nulla RecyclerView. Ho messo i registri per il debug e non viene mostrato alcun registro. Quale potrebbe essere il problema?

Il mio adattatore:

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

Il mio XML di riga personalizzato:

<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"/>

e il mio frammento:

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

perché imposti recyclerView.setAdapter (adattatore); 2 volte?
Panayiotis Irakleous

Un'altra causa di questo problema è erroneamente far corrispondere il layout dell'articolo all'altezza del genitore, quindi viene mostrato solo un elemento alla volta.
Joe Lapp,

Nel mio caso aiuta questo: invoicesRecyclerView.setHasFixedSize (true) fattureRecyclerView.setLayoutManager (GridLayoutManager (this, 1))
a_subscriber

Risposte:


239

Il vostro getItemCountmetodo returns 0. Quindi RecyclerViewnon cerca mai di creare un'istanza di una vista. Fallo restituire qualcosa greater than 0.

per esempio

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

25
oh cavolo, mi sento così stupido in questo momento! : facepalm: Grazie per questo!
Shinta,

3
Ho perso un'ora per questo perché getItemCount era molto al di sotto di tutti gli altri codici e non l'ho visto. : |
Gioele,

Avevo un adattatore personalizzato e avevo dimenticato di impostare il conteggio degli articoli sulle dimensioni della mia collezione
Dooie,

3
il mio numero di articoli è 3 non ancora visibile, nessun punto di debug entra in onBind o onCreateHolder ... ma arriva in getItemCount
Dr. aNdRO

Oddio! Anch'io stavo combattendo con questo per capire perché diamine il mio punto di interruzione non sta colpendo e ora so ... LOL! DANNAZIONE!!! GRAZIE!
Vincy,

409

Un altro è assicurarsi di impostare il layout manager su RecyclerView:

recycler.setLayoutManager(new LinearLayoutManager(this));

2
Torno a questa risposta troppo spesso ...
finki


15

Questo non vale per il tuo caso particolare. Ma questo potrebbe aiutare qualcun altro.

Questo motivo potrebbe essere un uso negligente del seguente metodo

recyclerView.setHasFixedSize(true);

Se non utilizzato con cautela, questo potrebbe causare il onBindViewe onCreateViewHolderdi non essere chiamato a tutti, senza errori nei log.


12

Si prega di impostare il layout manager RecyclerViewcome piace sotto il codice:

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

Per quello che vale, l'ho osservato quando ho impostato l'adattatore di visualizzazione del riciclatore prima che l'adattatore fosse effettivamente inizializzato. La soluzione era assicurarsi che recyclerView.setAdapter(adapter)fosse chiamato con un adattatore non nullo


9

Davvero davvero spero che questo aiuta qualcuno un giorno. Ho appena trascorso più di un'ora su questo impazzendo!

Ho avuto questo:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = adapter
        }

Quando avrei dovuto avere questo:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = projectAdapter
        }

Dato che ho chiamato scioccamente il mio adattatore adapter, era oscurato dall'adattatore della vista del riciclatore nel blocco apply! Ho rinominato l'adattatore in projectAdapter per differenziarlo e il problema è stato risolto!


6

Impostazione dell'altezza di TextViewin custom.xmlo RecyclerView. Se l'altezza è wrap-content, RecyclerViewnon sarà visibile.


Ho trascorso così tanto tempo su questo ... l'altezza della vista del riciclatore era zero. Se utilizzato in un'attività, si è in qualche modo espanso. In un frammento all'interno di altri layout .. non è così
Asif Shiraz,

4

Questo è successo quando ero RecyclerViewdentro a ScrollViewe stavo usando Android Support Library 23.0. Per risolvere, ho aggiornato alla libreria di supporto Android 23.2:

In build.gradle:

dependencies {
    ...
    compile 'com.android.support:appcompat-v7:23.2.+'
    compile 'com.android.support:cardview-v7:23.2.+'
}

4

Aggiungi questo alla tua classe adattatore

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

inoltre, è un duplicato
Ricardo A.

4

Forse aiuta qualcuno, ma se imposti la visibilità di RecycleView su GONE i metodi dell'adattatore non verranno chiamati affatto ... Mi ci è voluto un po 'di tempo per capirlo.


incredibile !!!!! ... carri armati così tanto ,,,
X-Black ...

3

Ho avuto lo stesso problema, perché stavo usando android.support.constraint.ConstraintLayoutnella risorsa di layout. Cambiare in FrameLayoutaiutato.


Grazie per la tua soluzione Qualche idea sul perché si comporti così se il genitore View è android.support.constraint.ConstraintLayout?
Adrian Buciuman,

2

Un'altra opzione è se si invia questo oggetto objetc utilizzando get, ad esempio verificare se si dispone del riferimento corretto

private list<objetc> listObjetc;
//Incorrect
public void setListObjetcs(list<objetc> listObjetc){
  listObjetc = listObjetc;
}

//Correct
public void setListObjetcs(list<objetc> listObjetc){
  this.listObjetc = listObjetc;
}

2

Ho lottato con questo problema per molte ore. Stavo usando un frammento. E il problema non stava restituendo il view. Di seguito è il mio codice:

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;

Codice strano. Queste variabili e classi sono difficili da capire.
CoolMind,

2

Vedi la mia risposta se stai utilizzando la libreria di associazione dati Android - Assicurati di impostare il layout per recyclerview e il conteggio degli articoli deve essere maggiore di 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);
        }
    }

Buona codifica :-)


1

Nel mio caso ho impostato l'ID del mio RecyclerView su "recyclerView". Sembra che questo ID sia già stato definito da qualche parte, perché quando l'ho cambiato in un ID diverso, i metodi dall'adattatore sono stati chiamati correttamente.


1

Se si utilizza un adattatore personalizzato, non dimenticare di impostare ItemCount sulla dimensione della raccolta.


1

Nel mio caso, la dimensione della mia lista era 0 e non chiamava il metodo onCreateViewHolder. Avevo bisogno di visualizzare un messaggio al centro per l'elenco vuoto come segnaposto, quindi l'ho fatto in questo modo e ha funzionato come un fascino. Risposta di @Konstantin Burov aiutata.

  @Override
public int getItemCount() {
    if (contactList.size() == 0) {
        return 1;
    } else {
        return contactList.size();
    }
}

Questa non è una buona idea. È meglio impostare la visibilità del messaggio vuoto quando si inseriscono i dati nell'adattatore.
L'incredibile gennaio

1

Il mio incontro è stato il metodo ignorato onBindViewHolder (titolare, posizione) del RecyclerView.adaptor non chiamato. È stato chiamato il metodo onCreateViewHolder, è stato chiamato getItemCount. Se leggi le specifiche per Recyclerview Adapter, imparerai che se hai ignorato onBindViewHolder (titolare, posizione, payload dell'elenco) verrà chiamato a favore. Quindi, per favore, stai attento.


Come hai risolto il problema di non chiamare onBindViewHolder?
CoolMind,

1

Se si inserisce wrap_content come altezza dell'elenco e altezza dell'elenco degli articoli, non verrà visualizzato nulla e nessuna delle funzioni di recyclerView verrà chiamata. Correggi l'altezza dell'elemento o inserisci match_parent per l'altezza dell'elenco. Ciò ha risolto il mio problema.


1

Il mio errore è stato gonfiare la visione sbagliata in Fragment onCreateView.



0

Per favore, fai la seguente cosa

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

0

Nel mio caso dopo aver modificato Activity per utilizzare ViewModel e DataBinding, mi ero dimenticato di rimuovere il setContentViewmetodo di chiamata dal onCreatemetodo. Rimuovendolo il mio problema è stato risolto.


0

Per me, è stato perché setHasStableIds (true); è stato impostato il metodo Rimuovilo e funzionerà


Ma questo metodo non sembra essere nell'esempio riproducibile minimo nella domanda. Se la rimozione di questo suggerimento risolve qualcosa, è probabilmente un'indicazione di un bug nell'implementazione del titolare della vista o forse del notificatore.

0

recyclerView.setAdapter (adattatore); chiamato L'elenco recyclerView viene popolato chiamando il metodo.


0

Assicurati che il tuo XMLe il Koltin/Javacodice corrispondano. Nel mio caso, ho avuto un problema con il ViewHolderfatto che avevo scritto:

var txt: AppCompatTextView = itemView.findViewById(R.id.txt)

Ma dal momento che il mio codice XML è:

<TextView
        android:id="@+id/txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        .../>

Ho dovuto cambiare la fila privata in:

var txt: TextView = itemView.findViewById(R.id.txt)

Inoltre, ho anche dovuto rimuovere:

recyclerView.setHasFixedSize(true);

Spero che ciò possa aiutarti :)


0

Nel mio caso, mi mancava la chiamata notifyDataSetChanged()dopo aver impostato l'elenco nell'adattatore.

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

0

Nel mio caso mi manca l'impostazione dell'orientamento nel mio LinearLayout.

Dopo aver aggiunto il problema di orientamento risolto.

 android:orientation="vertical"

0

Il mio problema era layout_heighte layout_widthdi RecyclerView impostato su 0dp.

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.