Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Equivalent of ListView.setEmptyView in RecyclerView

In RecyclerView, I want to set an empty view to be shown when the adapter is empty. Is there an equivalent of ListView.setEmptyView()?

like image 833
Manish Mulimani Avatar asked Dec 11 '14 02:12

Manish Mulimani


People also ask

What is viewType in onCreateViewHolder?

This viewType variable is internal to the Adapter class. It's used in the onCreateViewHolder() and onBindViewHolder to inflate and populate the mapped layouts. Before we jump into the implementation of the Adapter class, let's look at the types of layouts that are defined for each view type.

What is onCreateViewHolder?

onCreateViewHolder is called when you need a new View. If there is an available Recycled View that can be provided and be bound with new data, then onBindViewHolder is called :) 96. 96. 96.


2 Answers

Here's a class similar to @dragon born's, but more complete. Based on this gist.

public class EmptyRecyclerView extends RecyclerView {     private View emptyView;     final private AdapterDataObserver observer = new AdapterDataObserver() {         @Override         public void onChanged() {             checkIfEmpty();         }          @Override         public void onItemRangeInserted(int positionStart, int itemCount) {             checkIfEmpty();         }          @Override         public void onItemRangeRemoved(int positionStart, int itemCount) {             checkIfEmpty();         }     };      public EmptyRecyclerView(Context context) {         super(context);     }      public EmptyRecyclerView(Context context, AttributeSet attrs) {         super(context, attrs);     }      public EmptyRecyclerView(Context context, AttributeSet attrs, int defStyle) {         super(context, attrs, defStyle);     }      void checkIfEmpty() {         if (emptyView != null && getAdapter() != null) {             final boolean emptyViewVisible = getAdapter().getItemCount() == 0;             emptyView.setVisibility(emptyViewVisible ? VISIBLE : GONE);             setVisibility(emptyViewVisible ? GONE : VISIBLE);         }     }      @Override     public void setAdapter(Adapter adapter) {         final Adapter oldAdapter = getAdapter();         if (oldAdapter != null) {             oldAdapter.unregisterAdapterDataObserver(observer);         }         super.setAdapter(adapter);         if (adapter != null) {             adapter.registerAdapterDataObserver(observer);         }          checkIfEmpty();     }      public void setEmptyView(View emptyView) {         this.emptyView = emptyView;         checkIfEmpty();     } }
like image 185
Marc Plano-Lesay Avatar answered Nov 07 '22 17:11

Marc Plano-Lesay


With the new data binding feature you can also achieve this in your layout directly:

<TextView    android:text="No data to display."    android:visibility="@{dataset.size() > 0 ? View.GONE : View.VISIBLE}" /> 

In that case you just need to add a variable and an import to the data section of your XML:

<data> <import type="android.view.View"/> <variable     name="dataset"     type="java.util.List&lt;java.lang.String&gt;"     /> </data> 
like image 20
André Diermann Avatar answered Nov 07 '22 15:11

André Diermann