package com.fastaccess.ui.widgets.recyclerview; import android.content.Context; import android.content.res.TypedArray; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.view.View; import com.fastaccess.ui.widgets.recyclerview.layout_manager.GridManager; import static android.R.attr.columnWidth; /** * Created by Kosh on 9/24/2015. copyrights are reserved * <p> * recyclerview which will showParentOrSelf/showParentOrSelf itself base on adapter */ public class DynamicRecyclerView extends RecyclerView { private View emptyView; private int iconSize; @Nullable private View parentView; @NonNull private AdapterDataObserver observer = new AdapterDataObserver() { @Override public void onChanged() { showEmptyView(); } @Override public void onItemRangeInserted(int positionStart, int itemCount) { super.onItemRangeInserted(positionStart, itemCount); showEmptyView(); } @Override public void onItemRangeRemoved(int positionStart, int itemCount) { super.onItemRangeRemoved(positionStart, itemCount); showEmptyView(); } }; public DynamicRecyclerView(Context context) { this(context, null); } public DynamicRecyclerView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public DynamicRecyclerView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); if (attrs != null) { int[] attrsArray = {columnWidth}; TypedArray array = context.obtainStyledAttributes(attrs, attrsArray); iconSize = array.getDimensionPixelSize(0, -1); if (iconSize > 0) { setHasFixedSize(true); // iconSize += getResources().getDimensionPixelSize(R.dimen.spacing_micro); if (getLayoutManager() instanceof GridManager) { ((GridManager) getLayoutManager()).setIconSize(iconSize); } } array.recycle(); } } @Override public void setAdapter(@Nullable Adapter adapter) { super.setAdapter(adapter); if (adapter != null) { adapter.registerAdapterDataObserver(observer); observer.onChanged(); } } // @Override protected void onMeasure(int widthSpec, int heightSpec) { // super.onMeasure(widthSpec, heightSpec); // int width = MeasureSpec.getSize(widthSpec); // if (iconSize > 0 && width != 0) { // int spanCount = Math.max(1, width / iconSize); // if (getLayoutManager() instanceof GridLayoutManager) { // ((GridLayoutManager) getLayoutManager()).setSpanCount(spanCount); // getLayoutManager().requestLayout(); // } // } // } public void showEmptyView() { Adapter<?> adapter = getAdapter(); if (adapter != null) { if (emptyView != null) { if (adapter.getItemCount() == 0) { showParentOrSelf(false); } else { showParentOrSelf(true); } } } else { if (emptyView != null) { showParentOrSelf(false); } } } private void showParentOrSelf(boolean show) { if (parentView == null) { setVisibility(show ? VISIBLE : GONE); } else { parentView.setVisibility(show ? VISIBLE : GONE); } emptyView.setVisibility(!show ? VISIBLE : GONE); } public void setEmptyView(@NonNull View emptyView, @Nullable View parentView) { this.emptyView = emptyView; this.parentView = parentView; showEmptyView(); } public void setEmptyView(@NonNull View emptyView) { setEmptyView(emptyView, null); } public void hideProgress(@NonNull View view) { view.setVisibility(GONE); } public void showProgress(@NonNull View view) { view.setVisibility(VISIBLE); } public void setIconSize(int iconSize) { this.iconSize = iconSize; invalidate(); } }