webentwicklung-frage-antwort-db.com.de

Recyclerview ruft nicht onCreateViewHolder auf

Meine Variable RecyclerView ruft nicht onCreateViewHolder, onBindViewHolder sogar MenuViewHolder Konstruktor auf, daher erscheint in RecyclerView..__ nichts. Ich lege Protokolle zum Debuggen an, und es wird kein Protokoll angezeigt . Was könnte das Problem sein?

Mein Adapter:

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

Meine benutzerdefinierte Zeilen-XML:

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

und mein Fragment:

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

Ihre getItemCount-Methode returns 0. Also versucht RecyclerView nie, eine Ansicht zu instanziieren. Lass etwas greater than 0 zurückgeben.

zum Beispiel

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

Eine andere ist, stellen Sie sicher, dass Sie den Layout-Manager auf RecyclerView setzen:

recycler.setLayoutManager(new LinearLayoutManager(this));
331
Lay Leangsros

ich habe vergessen, die folgende Zeile hinzuzufügen, nachdem ich es hinzugefügt hatte

recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
35
saigopi

Dies gilt nicht für Ihren speziellen Fall. Aber das könnte jemand anderem helfen.

Dieser Grund könnte die folgende Methode leichtfertig verwenden

recyclerView.setHasFixedSize(true);

Wenn Sie nicht mit Vorsicht verwendet werden, kann dies dazu führen, dass onBindView und onCreateViewHolder überhaupt nicht aufgerufen werden, ohne dass Fehler in den Protokollen auftreten.

9
venky

Für das, was es wert ist, habe ich es beobachtet, als ich den Adapter für die Recycler-Ansicht gesetzt habe vorher der Adapter wurde tatsächlich initialisiert. Die Lösung bestand darin, sicherzustellen, dass recyclerView.setAdapter(adapter) mit einem Nicht-Null-Adapter aufgerufen wurde

9
kip2

Einstellen der Höhe von TextView in custom.xml oder RecyclerView Wenn height wrap-content ist, ist RecyclerView nicht sichtbar.

5
jian lang

Dies geschah, als sich meine RecyclerView in einer ScrollView befand und ich Android Support Library 23.0 verwendete. Zur Fehlerbehebung habe ich die Android Support Library 23.2 aktualisiert:

In build.gradle:

dependencies {
    ...
    compile 'com.Android.support:appcompat-v7:23.2.+'
    compile 'com.Android.support:cardview-v7:23.2.+'
}
4
J Wang

Fügen Sie dies Ihrer Adapterklasse hinzu

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

Vielleicht hilft es jemandem, aber wenn Sie die Sichtbarkeit Ihres RecycleView auf GONE setzen, werden die Adapter-Methoden überhaupt nicht aufgerufen.

3
breakline

Setzen Sie den Layout-Manager auf RecyclerView wie im folgenden Code:

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));
3
Mandeep Yadav

Ich hatte das gleiche Problem, weil ich Android.support.constraint.ConstraintLayout in der Layout-Ressource verwendete Das Umstellen auf FrameLayout hat geholfen.

3
Wild Teddy

Siehe meine Antwort, wenn Sie eine Android-Datenbindungsbibliothek verwenden - Stellen Sie sicher, dass Sie das Layout für die Wiederverwendungsübersicht einstellen und die Elementanzahl größer als 0 sein muss

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

Viel Spaß beim Codieren :-)

2
Bajrang Hudda

Ich hatte viele Stunden mit diesem Thema zu kämpfen. Ich habe ein Fragment benutzt. Und das Problem war nicht die view. Unten ist mein Code:

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;
2
TharakaNirmana

Eine andere Option ist, wenn Sie dieses Listenobjekt mithilfe von get senden

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

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

Wenn Sie einen benutzerdefinierten Adapter verwenden, vergessen Sie nicht, die ItemCount auf die Größe Ihrer Sammlung festzulegen.

1
Dooie

In meinem Fall setze ich die ID meines RecyclerView auf "RecyclerView". Es scheint, dass diese ID bereits irgendwo definiert wurde, da die Methoden des Adapters richtig aufgerufen wurden, wenn ich sie in eine andere ID änderte.

1

Wenn Sie wrap_content sowohl als Höhe Ihrer Liste als auch als Höhe Ihrer Artikelliste angeben, wird nichts angezeigt und keine Ihrer RecyclerView-Funktionen aufgerufen. Legen Sie die Höhe des Elements fest oder setzen Sie match_parent für die Listenhöhe. Das hat mein Problem gelöst.

1
Meriam

Ich hoffe wirklich wirklich , dass dies irgendwann jemandem hilft. Ich verbringe gerade mehr als eine Stunde damit, dass dieser verrückt wird!

Ich hatte das:

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

Wann hätte ich das haben sollen:

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

Da ich meinen Adapter dummerweise adapter genannt habe, wurde er vom Adapter der Recycler-Ansicht im Apply-Block abgeschattet! Ich habe den Adapter in projectAdapter umbenannt, um ihn zu unterscheiden und das Problem zu lösen!

1
the_new_mr

Mein Encouter war die überschriebene Methode onBindViewHolder (holder, position), bei der der RecyclerView.adaptor nicht aufgerufen wurde. Die Methode onCreateViewHolder wurde aufgerufen, getItemCount wurde aufgerufen. Wenn Sie die Spezifikationen für Recyclerview Adapter lesen, werden Sie erfahren, dass onBindViewHolder (Inhaber, Position, Listennutzlast) überschrieben wird. Also sei bitte vorsichtig.

1
Yaojin

In meinem Fall war meine Listengröße 0 und die Methode onCreateViewHolder Wurde nicht aufgerufen. Ich musste eine Nachricht in der Mitte für die leere Liste als Platzhalter anzeigen, also tat ich es so und es funktionierte wie Charme. Antwort von @Konstantin Burov hat geholfen.

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

In meinem Fall hatte ich nach dem Ändern von Activity zur Verwendung von ViewModel und DataBinding vergessen, die Aufrufe der setContentView-Methode von der onCreate-Methode zu entfernen. Durch das Entfernen wurde mein Problem gelöst.

0
Siamak Ferdos

recyclerView.setAdapter (Adapter); called Die recyclerView-Liste wird durch Aufrufen der Methode gefüllt.

0
Mesut Beysülen

Mein Fehler war, die falsche Ansicht in Fragment onCreateView aufzublähen.

0
Jeffrey

gehe zu deiner xml. Und ändern Sie Ihr Layout, um den Inhalt zu umbrechen. Das eine Element versteckt das nächste, daher funktionieren die Methoden nicht!

0
Koala

Bitte machen Sie folgendes 

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

Für mich war es wegen der setHasStableIds (true); Methode wurde gesetzt . Entfernen Sie das und es wird funktionieren

0
Catalin