Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to show an empty view with a RecyclerView?

I am used to put an special view inside the layout file as described in the ListActivity documentation to be displayed when there is no data. This view has the id "android:id/empty".

<TextView     android:id="@android:id/empty"     android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:text="@string/no_data" /> 

I wonder how this can be done with the new RecyclerView?

like image 242
JJD Avatar asked Jan 29 '15 14:01

JJD


People also ask

What is ViewHolder in RecyclerView?

A ViewHolder describes an item view and metadata about its place within the RecyclerView. RecyclerView. Adapter implementations should subclass ViewHolder and add fields for caching potentially expensive View. findViewById(int) results.

How do you load all items in RecyclerView without scrolling?

It's pretty simple, simply set the RecyclerView 's height to wrap_content . That's right.


2 Answers

On the same layout where is defined the RecyclerView, add the TextView:

<android.support.v7.widget.RecyclerView     android:id="@+id/recycler_view"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:scrollbars="vertical" />  <TextView     android:id="@+id/empty_view"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:gravity="center"     android:visibility="gone"     android:text="@string/no_data_available" /> 

At the onCreate or the appropriate callback you check if the dataset that feeds your RecyclerView is empty. If the dataset is empty, the RecyclerView is empty too. In that case, the message appears on the screen. If not, change its visibility:

private RecyclerView recyclerView; private TextView emptyView;  // ...  recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view); emptyView = (TextView) rootView.findViewById(R.id.empty_view);  // ...  if (dataset.isEmpty()) {     recyclerView.setVisibility(View.GONE);     emptyView.setVisibility(View.VISIBLE); } else {     recyclerView.setVisibility(View.VISIBLE);     emptyView.setVisibility(View.GONE); } 
like image 80
slellis Avatar answered Sep 19 '22 11:09

slellis


For my projects I made this solution (RecyclerView with setEmptyView method):

public class RecyclerViewEmptySupport extends RecyclerView {     private View emptyView;      private AdapterDataObserver emptyObserver = new AdapterDataObserver() {           @Override         public void onChanged() {             Adapter<?> adapter =  getAdapter();             if(adapter != null && emptyView != null) {                 if(adapter.getItemCount() == 0) {                     emptyView.setVisibility(View.VISIBLE);                     RecyclerViewEmptySupport.this.setVisibility(View.GONE);                 }                 else {                     emptyView.setVisibility(View.GONE);                     RecyclerViewEmptySupport.this.setVisibility(View.VISIBLE);                 }             }          }     };      public RecyclerViewEmptySupport(Context context) {         super(context);     }      public RecyclerViewEmptySupport(Context context, AttributeSet attrs) {         super(context, attrs);     }      public RecyclerViewEmptySupport(Context context, AttributeSet attrs, int defStyle) {         super(context, attrs, defStyle);     }      @Override     public void setAdapter(Adapter adapter) {         super.setAdapter(adapter);          if(adapter != null) {             adapter.registerAdapterDataObserver(emptyObserver);         }          emptyObserver.onChanged();     }      public void setEmptyView(View emptyView) {         this.emptyView = emptyView;     } } 

And you should use it instead of RecyclerView class:

<com.maff.utils.RecyclerViewEmptySupport android:id="@+id/list1"     android:layout_height="match_parent"     android:layout_width="match_parent"     />  <TextView android:id="@+id/list_empty"     android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:text="Empty"     /> 

and

RecyclerViewEmptySupport list =      (RecyclerViewEmptySupport)rootView.findViewById(R.id.list1); list.setLayoutManager(new LinearLayoutManager(context)); list.setEmptyView(rootView.findViewById(R.id.list_empty)); 
like image 23
maff91 Avatar answered Sep 21 '22 11:09

maff91