Open cairurui opened 7 years ago
just like this:
package com.leaf8.alicx.loadmorerecycler.dummy;
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.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.leaf8.alicx.loadmorerecycler.R;
/**
* Created by CaiRR on 2017-5-8.
*/
public abstract class BaseLoadMoreAdapter extends RecyclerView.Adapter<BaseLoadMoreAdapter.BaseViewHolder> {
private RecyclerView mRecyclerView;
public final static int TYPE_NORMAL = 0;
public final static int TYPE_HEADER = 1;//头部--支持头部增加一个headerView
public final static int TYPE_FOOTER = 2;//底部--往往是loading_more
public final static int TYPE_LIST = 3;//代表item展示的模式是list模式
public final static int TYPE_STAGGER = 4;//代码item展示模式是网格模式
private boolean mIsFooterEnable = false;//是否允许加载更多
private boolean mIsHeaderEnable;
private int mHeaderResId;
private boolean mIsLoadingMore;
private int mLoadMorePosition;
private LoadMoreListener mListener;
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
mRecyclerView = recyclerView;
recyclerView.addOnScrollListener(new RecyclerView.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();
// TODO 提前进入加载更多操作
if (lastVisiblePosition + 1 == getItemCount()) {
setLoadingMore(true);
mLoadMorePosition = lastVisiblePosition;
mListener.onLoadMore();
}
}
}
});
}
public void setLoadMoreListener(LoadMoreListener listener) {
mListener = listener;
}
public void setLoadingMore(boolean loadingMore) {
this.mIsLoadingMore = loadingMore;
}
/**
* 获取最后一条展示的位置
*
* @return
*/
private int getLastVisiblePosition() {
int position;
if (mRecyclerView.getLayoutManager() instanceof LinearLayoutManager) {
position = ((LinearLayoutManager) mRecyclerView.getLayoutManager()).findLastVisibleItemPosition();
} else if (mRecyclerView.getLayoutManager() instanceof GridLayoutManager) {
position = ((GridLayoutManager) mRecyclerView.getLayoutManager()).findLastVisibleItemPosition();
} else if (mRecyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager) {
StaggeredGridLayoutManager layoutManager = (StaggeredGridLayoutManager) mRecyclerView.getLayoutManager();
int[] lastPositions = layoutManager.findLastVisibleItemPositions(new int[layoutManager.getSpanCount()]);
position = getMaxPosition(lastPositions);
} else {
position = mRecyclerView.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;
}
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_HEADER) {
return new HeaderViewHolder(LayoutInflater.from(parent.getContext()).inflate(
mHeaderResId, parent, false));
}
if (viewType == TYPE_FOOTER) {
return new FooterViewHolder(
LayoutInflater.from(parent.getContext()).inflate(
R.layout.list_foot_loading, parent, false));
} else { // type normal
return setupOnCreateViewHolder(parent, viewType);
}
}
abstract BaseViewHolder setupOnCreateViewHolder(ViewGroup parent, int viewType);
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
int type = getItemViewType(position);
if (type != TYPE_FOOTER && type != TYPE_HEADER) {
setupOnBindViewHolder(holder, position);
}
}
abstract void setupOnBindViewHolder(RecyclerView.ViewHolder holder, int position);
@Override
public int getItemViewType(int position) {
int headerPosition = 0;
int footerPosition = getItemCount() - 1;
if (headerPosition == position && mIsHeaderEnable && mHeaderResId > 0) {
return TYPE_HEADER;
}
if (footerPosition == position && mIsFooterEnable) {
return TYPE_FOOTER;
}
/**
* 这么做保证layoutManager切换之后能及时的刷新上对的布局
*/
if (mRecyclerView.getLayoutManager() instanceof LinearLayoutManager) {
return TYPE_LIST;
} else if (mRecyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager) {
return TYPE_STAGGER;
} else {
return TYPE_NORMAL;
}
}
public class FooterViewHolder extends BaseViewHolder {
public FooterViewHolder(View itemView) {
super(itemView);
}
}
public class HeaderViewHolder extends BaseViewHolder {
public HeaderViewHolder(View itemView) {
super(itemView);
}
}
@Override
public int getItemCount() {
int count = setupGetItemCount();
if (mIsFooterEnable) count++;
if (mIsHeaderEnable) count++;
return count;
}
abstract int setupGetItemCount();
public void setHeaderEnable(boolean enable) {
mIsHeaderEnable = enable;
}
public void addHeaderView(int resId) {
mHeaderResId = resId;
}
public interface LoadMoreListener {
void onLoadMore();
}
public void setAutoLoadMoreEnable(boolean autoLoadMore) {
mIsFooterEnable = autoLoadMore;
}
public void notifyMoreFinish(boolean hasMore) {
setAutoLoadMoreEnable(hasMore);
notifyItemRemoved(mLoadMorePosition);
mIsLoadingMore = false;
}
public abstract class BaseViewHolder extends RecyclerView.ViewHolder {
public BaseViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClick(v, getAdapterPosition());
}
});
}
public void onItemClick(View view, int position) {
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(view, position);
}
}
}
public void setOnItemClickListener(OnItemClickListener listener) {
this.mOnItemClickListener = listener;
}
private OnItemClickListener mOnItemClickListener;
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
}
实现是通过继承 RecyclerView 来实现的,其中 adapter 似乎不能使用正常的方法了。一个改成继承 RecyclerView.Adapter 来实现。