package com.koushikdutta.boilerplate.recyclerview; import android.content.Context; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.view.View; /** * Created by koush on 5/24/15. */ public class HeaderRecyclerView extends RecyclerView implements IHeaderRecyclerView { private Adapter adapter; private AdapterWrapper adapterWrapper = new AdapterWrapper(); private HeaderViewAdapter headerViewAdapter = new HeaderViewAdapter(); private AdapterWrapper.WrappedAdapter wrappedAdapter; private View emptyView; public HeaderRecyclerView(Context context) { super(context); init(context, null, 0); } public HeaderRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs, 0); } public HeaderRecyclerView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs, defStyleAttr); } void init(Context context, AttributeSet attrs, int defStyleAttr) { adapterWrapper.wrapAdapter(headerViewAdapter); adapterWrapper.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { @Override public void onChanged() { super.onChanged(); updateEmptyState(); } }); } @Override public void setAdapter(RecyclerView.Adapter adapter) { adapterWrapper.remove(this.adapter); this.adapter = adapter; wrappedAdapter = adapterWrapper.wrapAdapter(adapter); super.setAdapter(adapterWrapper); } public AdapterWrapper.WrappedAdapter getWrappedAdapter() { return wrappedAdapter; } public void addHeaderView(View view) { headerViewAdapter.addHeaderView(headerViewAdapter.getItemCount(), view); } @Override public void addHeaderView(int index, View view) { headerViewAdapter.addHeaderView(index, view); } @Override public int findFirstVisibleItemPosition() { return ((LinearLayoutManager) getLayoutManager()).findFirstVisibleItemPosition(); } public void setEmptyView(View view) { if (emptyView != null) { emptyView.setVisibility(View.GONE); setVisibility(View.VISIBLE); } emptyView = view; updateEmptyState(); } void updateEmptyState() { if (emptyView == null) return; if (adapterWrapper.getItemCount() - headerViewAdapter.getItemCount() == 0) { emptyView.setVisibility(View.VISIBLE); setVisibility(View.GONE); } else { emptyView.setVisibility(View.GONE); setVisibility(View.VISIBLE); } } }