package com.gzsll.hupu.widget;
import android.content.Context;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.gzsll.hupu.R;
/**
* Created by sll on 2016/4/7.
*/
public class LoadMoreRecyclerView extends RecyclerView {
/**
* item 类型
*/
public final static int TYPE_NORMAL = 0;
public final static int TYPE_FOOTER = 1;
public final static int TYPE_LIST = 2;
public final static int TYPE_STAGGER = 3;
private boolean mIsFooterEnable = false;//是否允许加载更多
private AutoLoadAdapter mAutoLoadAdapter;
private boolean mIsLoadingMore;
private int mLoadMorePosition;
private LoadMoreListener mListener;
public LoadMoreRecyclerView(Context context) {
this(context, null);
}
public LoadMoreRecyclerView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public LoadMoreRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
addOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (null != mListener && mIsFooterEnable && !mIsLoadingMore && dy > 0) {
int lastVisiblePosition = getLastVisiblePosition();
if (lastVisiblePosition + 1 == mAutoLoadAdapter.getItemCount()) {
setLoadingMore(true);
mLoadMorePosition = lastVisiblePosition;
mListener.onLoadMore();
}
}
}
});
}
/**
* 设置加载更多的监听
*/
public void setLoadMoreListener(LoadMoreListener listener) {
mListener = listener;
}
/**
* 设置正在加载更多
*/
public void setLoadingMore(boolean loadingMore) {
this.mIsLoadingMore = loadingMore;
}
/**
* 加载更多监听
*/
public interface LoadMoreListener {
/**
* 加载更多
*/
void onLoadMore();
}
/**
*
*/
public class AutoLoadAdapter extends Adapter<ViewHolder> {
/**
* 数据adapter
*/
private Adapter mInternalAdapter;
public AutoLoadAdapter(Adapter adapter) {
mInternalAdapter = adapter;
}
@Override
public int getItemViewType(int position) {
int footerPosition = getItemCount() - 1;
if (footerPosition == position && mIsFooterEnable) {
return TYPE_FOOTER;
}
if (getLayoutManager() instanceof LinearLayoutManager) {
return TYPE_LIST;
} else if (getLayoutManager() instanceof StaggeredGridLayoutManager) {
return TYPE_STAGGER;
} else {
return TYPE_NORMAL;
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_FOOTER) {
return new FooterViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.layout_foot_loading, parent, false));
} else { // type normal
return mInternalAdapter.onCreateViewHolder(parent, viewType);
}
}
public class FooterViewHolder extends ViewHolder {
public FooterViewHolder(View itemView) {
super(itemView);
}
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
int type = getItemViewType(position);
if (type != TYPE_FOOTER) {
mInternalAdapter.onBindViewHolder(holder, position);
}
}
@Override
public int getItemCount() {
int count = mInternalAdapter.getItemCount();
if (mIsFooterEnable) count++;
return count;
}
}
@Override
public void setAdapter(Adapter adapter) {
if (adapter != null) {
mAutoLoadAdapter = new AutoLoadAdapter(adapter);
}
super.swapAdapter(mAutoLoadAdapter, true);
}
/**
* 获取最后一条展示的位置
*/
private int getLastVisiblePosition() {
int position;
if (getLayoutManager() instanceof LinearLayoutManager) {
position = ((LinearLayoutManager) getLayoutManager()).findLastVisibleItemPosition();
} else if (getLayoutManager() instanceof GridLayoutManager) {
position = ((GridLayoutManager) getLayoutManager()).findLastVisibleItemPosition();
} else if (getLayoutManager() instanceof StaggeredGridLayoutManager) {
StaggeredGridLayoutManager layoutManager = (StaggeredGridLayoutManager) getLayoutManager();
int[] lastPositions =
layoutManager.findLastVisibleItemPositions(new int[layoutManager.getSpanCount()]);
position = getMaxPosition(lastPositions);
} else {
position = getLayoutManager().getItemCount() - 1;
}
return position;
}
/**
* 获得最大的位置
*/
private int getMaxPosition(int[] positions) {
int size = positions.length;
int maxPosition = Integer.MIN_VALUE;
for (int i = 0; i < size; i++) {
maxPosition = Math.max(maxPosition, positions[i]);
}
return maxPosition;
}
/**
* 设置是否支持自动加载更多
*/
public void setLoadMoreEnable(boolean autoLoadMore) {
mIsFooterEnable = autoLoadMore;
}
public void onLoadCompleted(boolean hasMore) {
setLoadMoreEnable(hasMore);
if (mIsLoadingMore) {
getAdapter().notifyItemRemoved(mLoadMorePosition);
}
mIsLoadingMore = false;
}
}