Kore/app/src/main/java/org/xbmc/kore/ui/viewgroups/RecyclerViewEmptyViewSuppor...

169 lines
5.0 KiB
Java

/*
* Copyright 2018 Martijn Brekhof. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.xbmc.kore.ui.viewgroups;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.GridLayoutManager;
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
/**
* <p>A Recycler view using a grid layout that supports auto sizing and showing an empty view when the adapter
* has no items.
* </p>
* <p>
* You can set the column width and column count using styleables:
* </p>
* <ul>
* <li>android:columnWidth=INTEGER</li>
* <li>android:columnCount=INTEGER</li>
* </ul>
*
* Inspired by <a href="http://blog.sqisland.com/2014/12/recyclerview-autofit-grid.html">RecyclerView: Autofit grid</a>
*/
public class RecyclerViewEmptyViewSupport extends FastScrollRecyclerView {
public final static int AUTO_FIT = -1;
private View emptyView;
private OnItemClickListener onItemClickListener;
private int columnWidth;
private int columnCount = AUTO_FIT;
private GridLayoutManager gridLayoutManager;
private boolean multiColumnSupported;
public interface OnItemClickListener {
void onItemClick(View v, int position);
}
public RecyclerViewEmptyViewSupport(Context context) {
this(context, null);
}
public RecyclerViewEmptyViewSupport(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
@SuppressWarnings("ResourceType")
public RecyclerViewEmptyViewSupport(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setSaveEnabled(true);
if (attrs != null) {
int[] attrsArray = {
android.R.attr.columnWidth, android.R.attr.columnCount
};
TypedArray array = context.obtainStyledAttributes(
attrs, attrsArray);
columnWidth = array.getDimensionPixelSize(0, -1);
columnCount = array.getInteger(1, AUTO_FIT);
array.recycle();
}
gridLayoutManager = new GridLayoutManager(getContext(), 1);
setLayoutManager(gridLayoutManager);
}
@Override
public void setAdapter(final Adapter adapter) {
super.setAdapter(adapter);
if (adapter == null)
return;
adapter.registerAdapterDataObserver(new AdapterDataObserver() {
@Override
public void onChanged() {
super.onChanged();
if (emptyView == null)
return;
if (adapter.getItemCount() == 0) {
emptyView.setVisibility(View.VISIBLE);
setVisibility(View.GONE);
} else {
emptyView.setVisibility(View.GONE);
setVisibility(View.VISIBLE);
}
}
});
}
@Override
public void onViewAdded(final View child) {
super.onViewAdded(child);
child.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onItemClickListener.onItemClick(v, getChildAdapterPosition(child));
}
});
}
@Override
protected void onMeasure(int widthSpec, int heightSpec) {
super.onMeasure(widthSpec, heightSpec);
int spanCount = Math.max(1, getMeasuredWidth() / columnWidth);
multiColumnSupported = spanCount > 1;
if (columnCount == AUTO_FIT) {
gridLayoutManager.setSpanCount(spanCount);
} else {
gridLayoutManager.setSpanCount(columnCount);
}
}
public boolean isMultiColumnSupported() {
return multiColumnSupported;
}
/**
* Sets the amount of columns.
* @param count amount of columns to use. Use {@link #AUTO_FIT}
* to calculate the amount based on available screen width
* and the specified column width
*/
public void setColumnCount(int count) {
columnCount = count;
invalidate();
}
public int getColumnCount() {
return columnCount;
}
public void setEmptyView(View emptyView) {
this.emptyView = emptyView;
}
public View getEmptyView() {
return emptyView;
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
}