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;
}
recyclerView.setAdapter(adapter); called The recyclerView list is populated by calling the method.
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.
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.
Another one is make sure you set layout manager to RecyclerView:
Your
getItemCount
methodreturns 0
. SoRecyclerView
never tries to instantiate a view. Make it return somethinggreater than 0
.for example
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