Recyclerview not call onCreateViewHolder
JavaAndroidAndroid RecyclerviewJava Problem Overview
My RecyclerView
does not call onCreateViewHolder
, onBindViewHolder
even MenuViewHolder
constructor, therefore nothing appears in RecyclerView
.
I put logs for debugging, and no log is shown.
What might be the problem?
My 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);
}
}
My custom row 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"/>
and my 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;
}
Java Solutions
Solution 1 - Java
Another one is make sure you set layout manager to RecyclerView:
recycler.setLayoutManager(new LinearLayoutManager(this));
Solution 2 - Java
Your getItemCount
method returns 0
. So RecyclerView
never tries to instantiate a view. Make it return something greater than 0
.
for example
@Override
public int getItemCount() {
return data.size();
}
Solution 3 - Java
i forgot to add below line after i adding it worked for me
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
Solution 4 - Java
I really really hope this helps someone someday. I just spent over an hour on this one going nuts!
I had this:
projects_recycler_view.apply {
this.layoutManager = linearLayoutManager
this.adapter = adapter
}
When I should have had this:
projects_recycler_view.apply {
this.layoutManager = linearLayoutManager
this.adapter = projectAdapter
}
Because I foolishly called my adapter adapter
, it was being shadowed by the recycler view's adapter in the apply block! I renamed the adapter to projectAdapter to differentiate it and problem solved!
Solution 5 - Java
Please set layout manager to RecyclerView
like below 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));
Solution 6 - Java
This does not apply for your particular case. But this might help someone else.
This reason could be careless usage of the following method
recyclerView.setHasFixedSize(true);
If not used with caution, this might cause the onBindView
and onCreateViewHolder
to not be called at all, with no error in the logs.
Solution 7 - Java
For what it's worth, I observed it when I set the recycler view adapter before the adapter was actually initialized. Solution was to make sure recyclerView.setAdapter(adapter)
was called with a non-null adapter
Solution 8 - Java
Maybe it helps someone but if you set your RecycleView's visibility to GONE the adapter methods won't be called at all... Took me some time to figure it out.
Solution 9 - Java
Setting the height of the TextView
in the custom.xml
or RecyclerView
. If height is wrap-content
, the RecyclerView
will not be visible.
Solution 10 - Java
This happened when my RecyclerView
was inside a ScrollView
and I was using Android Support Library 23.0. To fix, I updated to Android Support Library 23.2:
In build.gradle:
dependencies {
...
compile 'com.android.support:appcompat-v7:23.2.+'
compile 'com.android.support:cardview-v7:23.2.+'
}
Solution 11 - Java
I had the same problem, because I was using android.support.constraint.ConstraintLayout
in layout resource.
Changing to FrameLayout
helped.
Solution 12 - Java
Add this to Your Adapter Class
@Override
public int getItemCount() {
return mDataset.size();
}
Solution 13 - Java
Other option is if you send this list objetc using get,verify if you have correct reference,for example
private list<objetc> listObjetc;
//Incorrect
public void setListObjetcs(list<objetc> listObjetc){
listObjetc = listObjetc;
}
//Correct
public void setListObjetcs(list<objetc> listObjetc){
this.listObjetc = listObjetc;
}
Solution 14 - Java
In my case, my list size was 0 and it was not calling the onCreateViewHolder method. I needed to display a message at center for the empty list as a placeholder so I did it like this and it worked like charm. Answer by @Konstantin Burov helped.
@Override
public int getItemCount() {
if (contactList.size() == 0) {
return 1;
} else {
return contactList.size();
}
}
Solution 15 - Java
I struggled with this issue for many hours. I was using a fragment. And the issue was not returning the view
. Below is my 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;
Solution 16 - Java
See my answer if you are using android data binding library - Make sure you are setting layout for recyclerview and item count must be greater than 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);
}
}
Happy coding :-)
Solution 17 - Java
If you put wrap_content as height of your list as well as the height of your item list, nothing will show up and none of your recyclerView functions will be called. Fix the height of the item or put match_parent for the list height. That solved my problem.
Solution 18 - Java
You forget this line in the xml app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
or
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
Solution 19 - Java
In my case I set the ID of my RecyclerView to "recyclerView". It seems that this ID was already defined somewhere, because when I changed that to different ID, the methods from the adapter were called properly.
Solution 20 - Java
If using a custom adapter do not forget to set the ItemCount to the size of your collection.
Solution 21 - Java
My encouter was the onBindViewHolder( holder , position) overrided method of the RecyclerView.adaptor not being called. Method onCreateViewHolder was called, getItemCount was called. If you read the specs for Recyclerview Adapter, you will learn that if you have overrided onBindViewHolder( holder, position, List
Solution 22 - Java
My mistake was inflating the wrong view in Fragment onCreateView.
Solution 23 - Java
Please do the following thing
@Override
public int getItemCount() {
return data.size();
}
Solution 24 - Java
In my case after changing Activity to use ViewModel and DataBinding, I had forgotten to remove setContentView
method calling from onCreate
method. By removing it my problem solved.
Solution 25 - Java
For me, it was because the setHasStableIds(true); method was set. Remove that and it will work
Solution 26 - Java
recyclerView.setAdapter(adapter); called The recyclerView list is populated by calling the method.
Solution 27 - Java
Make sure your XML
and Koltin/Java
code match. In my case, I had a problem with the ViewHolder
since I had written:
var txt: AppCompatTextView = itemView.findViewById(R.id.txt)
But since my XML code is:
<TextView
android:id="@+id/txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
.../>
I had to change the privious row into:
var txt: TextView = itemView.findViewById(R.id.txt)
In addition, I also had to remove:
recyclerView.setHasFixedSize(true);
I hope this can help you :)
Solution 28 - Java
In my case , I was missing calling notifyDataSetChanged()
after setting list in adapter.
public void setUserList(List<UserList> userList) {
this.userList = userList;
notifyDataSetChanged();
}
Solution 29 - Java
In my case I miss to set the orientation in my LinearLayout.
After adding orientation issue fixed.
android:orientation="vertical"
Solution 30 - Java
My problem was layout_height
and layout_width
of the RecyclerView set to 0dp
.
Solution 31 - Java
I had an issue because i setup the layout by myself and have put
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/band_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.recyclerview.widget.RecyclerView>
and
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/band_recycler_view"
android:layout_width="0dp"
android:layout_height="0dp"
android:textAlignment="center">
resolved my issue
Solution 32 - Java
Not the case in the main post, but it may come in handy for someone. If you set setHasStableIds(true);, override getItemId(position) is the adapter.
Solution 33 - Java
You can add this in your XML widget RecyclerView
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
or manually
reyclerview.setLayoutManager(new LinearLayoutManager(ActivityName.this));
Solution 34 - Java
In my case I was returning null from onCreateView of fragment.
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding=DataBindingUtil.inflate(inflater,R.layout.fragment_add_budget,container,false)
setRecyclerView()
return null// that was the culprit
}
Solution 35 - Java
My answer do not applies to yours but may apply to someones else cause I had the same problem you are facing.
So I actually did:
RecyclerView rv = new RecyclerView(this);
instead of
RecyclerView rv = findViewById(R.id.Recycler);
So make sure to take a note on that.