'Recycler View Not Showing
I have been making an app that uses a recycler view in a navigation drawer. Why the contents of the recycler view are not showing up. The view is definitely there as I can see the scroll shadows. I am not sure what I have done wrong, as the app does not crash when it is run.
Navigation Drawer Fragment:
public class NavigationDrawerFragment extends android.support.v4.app.Fragment {
public static final String PREF_FILE_NAME = "testPref";
public static final String KEY_USER_LEARNED_DRAWER = "user_learned_drawer";
private RecyclerView mRecyclerView;
private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;
private View containerView;
private Boolean mUserLearnedDrawer;
private Boolean mFromSavedInstanceState;
private DrawerAdapter adapter;
public NavigationDrawerFragment() {
mFromSavedInstanceState = false;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mUserLearnedDrawer = Boolean.valueOf(readFromPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, "false"));
if (savedInstanceState != null){
mFromSavedInstanceState = true;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View layout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
mRecyclerView = (RecyclerView) layout.findViewById(R.id.drawerList);
adapter = new DrawerAdapter(getActivity(), getData());
mRecyclerView.setAdapter(adapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
return layout;
}
public static List<DrawerRow> getData(){
List<DrawerRow> data = new ArrayList<>();
int icons[] = {R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher};
String titles[] = {"Link 1","Link 2","Link 3","Link 4"};
for (int i = 0 ; i < titles.length && i < icons.length; i++){
DrawerRow current = new DrawerRow();
current.iconId = icons[i];
current.title = titles[i];
data.add(current);
}
return data;
}
public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) {
containerView = getActivity().findViewById(fragmentId);
mDrawerLayout = drawerLayout;
mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, toolbar, R.string.drawerOpen, R.string.drawerClosed){
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if(!mUserLearnedDrawer){
mUserLearnedDrawer = true;
saveToPreferences(getActivity(),KEY_USER_LEARNED_DRAWER, mUserLearnedDrawer+"");
}
getActivity().invalidateOptionsMenu();
}
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
getActivity().invalidateOptionsMenu();
}
};
if(!mUserLearnedDrawer && !mFromSavedInstanceState){
mDrawerLayout.openDrawer(containerView);
}
mDrawerLayout.setDrawerListener(mDrawerToggle);
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
}
public void saveToPreferences(Context context, String prefName, String prefValue){
SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor mEditor = sharedPreferences.edit();
mEditor.putString(prefName, prefValue);
mEditor.apply();
}
public static String readFromPreferences(Context context, String prefName, String defaultValue){
SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE);
return sharedPreferences.getString(prefName,defaultValue);
}
}
Adapter:
public class DrawerAdapter extends RecyclerView.Adapter<DrawerAdapter.MyViewHolder>{
private LayoutInflater inflator;
List<DrawerRow> data = Collections.EMPTY_LIST;
public DrawerAdapter(FragmentActivity activity, List<DrawerRow> data) {
inflator = LayoutInflater.from(activity);
this.data = data;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = inflator.inflate(R.layout.nav_drawer_row , viewGroup,false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder viewHolder, int i) {
DrawerRow current = data.get(i);
viewHolder.title.setText(current.title);
viewHolder.icon.setImageResource(current.iconId);
}
@Override
public int getItemCount() {
return 0;
}
class MyViewHolder extends RecyclerView.ViewHolder{
ImageView icon;
TextView title;
public MyViewHolder(View itemView) {
super(itemView);
icon = (ImageView) itemView.findViewById(R.id.list_icon);
title = (TextView) itemView.findViewById(R.id.list_text);
}
}
}
Drawer Row:
public class DrawerRow {
int iconId;
String title;
}
Layout:
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/drawerLayout">
<!--Main Content -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
android:id="@+id/app_bar"
layout="@layout/app_bar" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text" />
</LinearLayout>
<!--Nav Drawer -->
<fragment
android:layout_width="@dimen/nav_drawer_width"
android:layout_height="match_parent"
android:layout_gravity="start"
android:name="uk.co.clickcomputing.hhscweatherstation.NavigationDrawerFragment"
android:id="@+id/fragment_navigation_drawer"/>
</android.support.v4.widget.DrawerLayout>
Drawer Row:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:padding="@dimen/list_padding"
android:id="@+id/list_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/ic_launcher"/>
<TextView
android:padding="@dimen/list_padding"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="New Text"
android:id="@+id/list_text" />
</LinearLayout>
Navigation Drawer Fragment Layout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#eee"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="140dp"
android:layout_marginBottom="8dp"
android:contentDescription="@string/nav_drawer_img_desciption"
android:scaleType="centerCrop"
android:src="@drawable/nav_drawer" />
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/drawerList">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
Solution 1:[1]
The issue is that you are returning the item count as 0 which tells that there is no rows to show. You should return the size of the List as shown below.
@Override
public int getItemCount() {
return data.size();
}
Solution 2:[2]
Replace following line
mRecyclerView.setAdapter(adapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
with
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mRecyclerView.setAdapter(adapter);
Solution 3:[3]
I agree that you need to return the correct item number but I think you might have a problem with setting the recycler view's height to wrap_content as well. I found this link very helpful. Hope it helps.
Solution 4:[4]
Make sure RecyclerView parent container width not set as WrapContent
Solution 5:[5]
@Override
public int getItemCount() {
return data.size();
}
and layout height in your row is android:layout_height="match_parent"
but must be android:layout_height="wrap_content"
Solution 6:[6]
Check for your RecyclerView's width and height attributes, if they are set to wrap content, change it to match parent or constraint your view in some specific area. Also check for Parent view's width attribute, if it's set to wrap content change it to match parent as well.
Solution 7:[7]
I have given static height and match_parent. It works for my Example I haved added it in nested recyclerview.
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/new_store_page_phoneNumber_rv"
android:layout_width="match_parent"
android:layout_height="50dp"
android:scrollIndicators="bottom"
android:fadeScrollbars="false"
android:layout_gravity="center_vertical"
app:adapter="@{adapter}"
android:focusable="true"
android:focusableInTouchMode="true"
android:clickable="true"
android:scrollbarAlwaysDrawHorizontalTrack="true"
android:scrollbars="none"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:orientation="horizontal" />
Solution 8:[8]
If you are fetching data from the network, make sure you are reloading/refreshing your adapter in the UI thread. This was the solution for me.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Pavneet_Singh |
Solution 2 | Mangal |
Solution 3 | Community |
Solution 4 | Ram Chhabra |
Solution 5 | alireza goodarzi |
Solution 6 | Kashif Masood |
Solution 7 | Sobhana kr |
Solution 8 | AAP |