RecyclerView出现已经有一段时间了,可以通过导入support-v7对其进行使用。
据官方的介绍,该控件用于在有限的窗口中展示大量数据集,
其实这样功能的控件并不陌生,例如:ListView、GridView。
那么有了ListView、GridView为什么还需要RecyclerView这样的控件呢?
整体上看RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,
通过设置它提供的不同LayoutManager,
ItemDecoration , ItemAnimator实现非常炫的效果。
你想要控制其显示的方式,
请通过布局管理器LayoutManager你想要控制Item间的间隔(可绘制),
请通过ItemDecoration你想要控制Item增删的动画,
请通过ItemAnimator你想要控制点击、长按事件,自己实现。。。。。。。
实现非常简单
布局文件:
在RecyclerView包裹SwipeRefreshLayout
RefreshRecyclerView(自定义的view)
public class RefreshRecyclerView extends RecyclerView {
private AutoLoadAdapter autoLoadAdapter;
public RefreshRecyclerView(Context context) {
this(context, null);
}
public RefreshRecyclerView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RefreshRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private boolean isLoadingMore = false;//是否正在加载更多
private OnLoadMoreListener loadMoreListener;//加载数据监听
private boolean loadMoreEnable = false;//是否允许加载更多
private int footerResource = -1;//脚布局
private boolean footer_visible = false;//脚部是否可以见
private void init() {
setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (getAdapter() != null && getLayoutManager() != null) {
int lastVisiblePosition = ((LinearLayoutManager) getLayoutManager()).findLastVisibleItemPosition();
int itemCount = getAdapter().getItemCount();
/**
* 控制下拉刷新回调
* itemCount != 0 排除没有数据情况
* lastVisiblePosition + 4 >= itemCount - 1 最后可见+4 >= 总条数 加载更多
* distanceY < 0 为上拉的时候才刷新
*/
if (distanceY < 0 && itemCount != 0 && lastVisiblePosition + 4 >= itemCount - 1 && !isLoadingMore && loadMoreEnable) {
Log.i("test","加载更多");
//正在加载更多
loading();
if (footerResource != -1){//有脚布局
//显示脚布局
footer_visible = true;
getAdapter().notifyItemChanged(itemCount - 1);
}
if (loadMoreListener != null) {
loadMoreListener.loadMoreListener();
}
}
}
}
});
}
/**
* 判断滑动方向
*/
private float distanceY = 0;
float startY = 0;
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
float y = ev.getRawY();
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
startY = y;
break;
case MotionEvent.ACTION_MOVE:
distanceY = y - startY;
startY = y;
break;
}
return super.dispatchTouchEvent(ev);
}
@Override
public void setAdapter(Adapter adapter) {
SlideInBottomAnimationAdapter slideInBottomAnimationAdapter = new SlideInBottomAnimationAdapter(adapter);
slideInBottomAnimationAdapter.setDuration(600);
autoLoadAdapter = new AutoLoadAdapter(slideInBottomAnimationAdapter);//添加动画
super.setAdapter(autoLoadAdapter);
}
/**
* 设置是否允许加载更多
*
* @param isEnable
*/
public void setLoadMoreEnable(boolean isEnable) {
this.loadMoreEnable = isEnable;
}
/**
* 设置脚布局
*/
public void setFooterResource(int footerResource) {
this.footerResource = footerResource;
}
/**
* 加载完成
*/
private void loadMoreComplete() {
this.isLoadingMore = false;
}
/**
* 正在刷新
*/
private void loading(){
this.isLoadingMore = true;//设置正在刷新
}
/**
* 加载更多数据回调
*
* @param listener
*/
public void setOnLoadMoreListener(OnLoadMoreListener listener) {
this.loadMoreListener = listener;
}
public interface OnLoadMoreListener {
void loadMoreListener();//上拉刷新
}
/**
* 刷新数据
*/
public void notifyData() {
if (getAdapter() != null) {
loadMoreComplete();
if(footerResource != -1 && loadMoreEnable){
//隐藏脚布局
footer_visible = false;
}
getAdapter().notifyDataSetChanged();
}
}
public class AutoLoadAdapter extends Adapter {
private Adapter dataAdapter;//数据adapter
private final int TYPE_FOOTER = Integer.MAX_VALUE;//底部布局
public AutoLoadAdapter(Adapter adapter) {
this.dataAdapter = adapter;
}
@Override
public int getItemViewType(int position) {
if (position == getItemCount() - 1 && loadMoreEnable && footerResource != -1 && footer_visible) {
return TYPE_FOOTER;
}
if (dataAdapter.getItemViewType(position) == TYPE_FOOTER) {
throw new RuntimeException("adapter中itemType不能为:" + Integer.MAX_VALUE);
}
return dataAdapter.getItemViewType(position);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ViewHolder holder = null;
if (viewType == TYPE_FOOTER) {//脚部
holder = new FooterViewHolder(LayoutInflater.from(getContext()).inflate(footerResource, parent, false));
} else {//数据
holder = dataAdapter.onCreateViewHolder(parent, viewType);
}
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
int itemViewType = getItemViewType(position);
if (itemViewType != TYPE_FOOTER) {
dataAdapter.onBindViewHolder(holder, position);
}
}
@Override
public int getItemCount() {
if (dataAdapter.getItemCount() != 0) {
int count = dataAdapter.getItemCount();
if (loadMoreEnable && footerResource != -1 && footer_visible) {
count++;
}
return count;
}
return 0;
}
public class FooterViewHolder extends ViewHolder {
public FooterViewHolder(View itemView) {
super(itemView);
}
}
}
}
activity中:
mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_red_light, android.R.color.ho lo_blue_light, android.R.color.holo_green_light);
recyclerView.setLoadMoreEnable(true);//允许加载更多
recyclerView.setFooterResource(R.layout.item_footer);//设置脚布局
recyclerView.setOnLoadMoreListener(new RefreshRecyclerView.OnLoadMoreListener() {
@Override
public void loadMoreListener() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
statisticsResponseModel = new StatisticsResponseModel();
statisticsResponseModel.setName("OK" + i);
mList.add(statisticsResponseModel);
}
mRefreshAdapter.setmList(mList);
recyclerView.notifyData();//刷新数据
}
}, 5000);
}
});//分页
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(false);
recyclerView.notifyData();//刷新数据
}
}, 2000);
}
});
}//下拉刷新
gradle文件添加:
compile 'jp.wasabeef:recyclerview-animators:1.3.0'
有问题联系:1808418098(微信、QQ)