package com.frozendevs.periodictable.view; import android.content.Context; import android.util.AttributeSet; import android.view.ContextMenu; import android.view.View; public class RecyclerView extends android.support.v7.widget.RecyclerView { private View mEmptyView; private RecyclerContextMenuInfo mContextMenuInfo; public class RecyclerContextMenuInfo implements ContextMenu.ContextMenuInfo { public View targetView; public int position; public long id; public RecyclerContextMenuInfo(View targetView, int position, long id) { this.targetView = targetView; this.position = position; this.id = id; } } private final android.support.v7.widget.RecyclerView.AdapterDataObserver observer = new android.support.v7.widget.RecyclerView.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 RecyclerView(Context context) { super(context); } public RecyclerView(Context context, AttributeSet attrs) { super(context, attrs); } public RecyclerView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } private void checkIfEmpty() { if (mEmptyView != null && getAdapter() != null) { final boolean emptyViewVisible = getAdapter().getItemCount() == 0; mEmptyView.setVisibility(emptyViewVisible ? VISIBLE : GONE); setVisibility(emptyViewVisible ? GONE : VISIBLE); } } @Override public void setAdapter(android.support.v7.widget.RecyclerView.Adapter adapter) { final RecyclerView.Adapter oldAdapter = getAdapter(); if (oldAdapter != null) { oldAdapter.unregisterAdapterDataObserver(observer); } super.setAdapter(adapter); if (adapter != null) { adapter.registerAdapterDataObserver(observer); } checkIfEmpty(); } public void setEmptyView(View emptyView) { mEmptyView = emptyView; checkIfEmpty(); } @Override protected ContextMenu.ContextMenuInfo getContextMenuInfo() { return mContextMenuInfo; } @Override public boolean showContextMenuForChild(View originalView) { final int position = getChildAdapterPosition(originalView); if (position > NO_POSITION) { mContextMenuInfo = new RecyclerContextMenuInfo(originalView, position, getAdapter().getItemId(position)); return super.showContextMenuForChild(originalView); } return false; } }