MyRecycleView带有上拉加载更多
package com.gan.myrecycleview; import android.content.Context;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView; import com.gan.myrecycleview.wrapper.LoadMoreWrapper; import java.util.List; /**
* 用途: 自定义recycleview实现下拉刷新和自动加载
* 创建者:ganyufei
* 时间: 2017/2/8
*/ public class MyRecycleView<T> extends LinearLayout { private RecyclerView recyclerView;
private SwipeRefreshLayout swipeRfl;
// private LinearLayoutManager layoutManager;
private SwipeRefreshLayout.OnRefreshListener mRefreshListener;
private CommonAdapter mAdapter;
private RefreshLoadMoreListener mRefreshLoadMoreListner;//下拉和加载更多监听
private ItemClickListener itemClickListener;//item点击监听
private LinearLayout mExceptView;
private LinearLayout mLoadingView;
private boolean hasMore = false;//是否还有更多数据加载
private boolean canMore = true;//是否可以加载更多
private boolean isCanRefresh = true;//是否可以刷新更多
private boolean isRefresh = false;//正在刷新
private boolean isLoadMore = false;//正在加载更多
private LoadMoreWrapper mLoadMoreWrapper;//为了实现加载更多footview private ImageView exceptIv;//异常图片控件
private TextView exceptTv;//异常内容文本控件 private ProgressBar loadingIv;//正在加载图片控件
private TextView loadingTv;//正在加载文本控件
private RecyclerView.ItemAnimator itemAnimator; public MyRecycleView(Context context) {
super(context);
} public MyRecycleView(Context context, AttributeSet attrs) {
super(context, attrs);
LinearLayout rootLl = new LinearLayout(context);
rootLl.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
mLoadingView = initLoadingView(context);
mLoadingView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
mExceptView = initExceptionView(context);
mExceptView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
mExceptView.setVisibility(View.GONE);
swipeRfl = new SwipeRefreshLayout(context);
swipeRfl.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
swipeRfl.setColorSchemeResources(android.R.color.holo_blue_light,
android.R.color.holo_red_light, android.R.color.holo_orange_light);
FrameLayout bootLl = new FrameLayout(context);
bootLl.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT));
recyclerView = new RecyclerView(context);
recyclerView.setVerticalScrollBarEnabled(true);
recyclerView.setHorizontalScrollBarEnabled(true);
if (itemAnimator!=null)
recyclerView.setItemAnimator(itemAnimator);
else {
recyclerView.setItemAnimator(new DefaultItemAnimator());
}
recyclerView.setLayoutParams(new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
bootLl.addView(mLoadingView);
bootLl.addView(recyclerView);
bootLl.addView(mExceptView);
swipeRfl.addView(bootLl);
rootLl.addView(swipeRfl);
this.addView(rootLl);
/**
* 下拉至顶部刷新监听
*/
mRefreshListener = new SwipeRefreshLayout.OnRefreshListener() { @Override
public void onRefresh() {
if (!isRefresh && !isLoadMore) {
isRefresh = true;
refresh();
}
}
};
swipeRfl.setOnRefreshListener(mRefreshListener);
recyclerView.setHasFixedSize(true);//不是瀑布流这个将可以优化性能
} public MyRecycleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
} /**
* 错误提示界面初始化
*
* @param context
* @return
*/
private LinearLayout initExceptionView(Context context) {
LinearLayout rootLl = (LinearLayout) View.inflate(context, R.layout.mycycleview_err, null);
exceptIv = (ImageView) rootLl.findViewById(R.id.myrecle_img);
exceptIv.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// 点击图片刷新
if (!isRefresh) {
swipeRfl.setRefreshing(true);
isRefresh = true;
refresh();
}
}
});
exceptTv = (TextView) rootLl.findViewById(R.id.myrecle_msg);
return rootLl;
} /**
* 初始化正在加载页面
*
* @param context
* @return
*/
private LinearLayout initLoadingView(Context context) {
LinearLayout rootLl = (LinearLayout) View.inflate(context, R.layout.mycycleview_firstload, null);
loadingIv = (ProgressBar) rootLl.findViewById(R.id.myrecle_load_progress);
loadingTv = (TextView) rootLl.findViewById(R.id.myrecle_load_msg);
return rootLl;
} /**
* drawableId 错误提示图片
* exceptStr 错误提示语
*/
public void customExceptView(int drawableId, String exceptStr) {
recyclerView.setVisibility(View.INVISIBLE);
mExceptView.setVisibility(View.VISIBLE);
mLoadingView.setVisibility(View.INVISIBLE);
exceptIv.setImageResource(drawableId);
exceptTv.setText(exceptStr);
swipeRfl.setEnabled(false);//出现错误之后,将设定无法下拉,运用点击图片进行刷新
} /**
* drawableId 正在加载提示图片
* exceptStr 正在加载提示语
*/
public void customLoadView(String exceptStr) {
recyclerView.setVisibility(View.INVISIBLE);
mLoadingView.setVisibility(View.VISIBLE);
mExceptView.setVisibility(View.INVISIBLE);
loadingTv.setText(exceptStr);
swipeRfl.setEnabled(false);
} public void scrollToTop() {
recyclerView.scrollToPosition(0);
} public void setAdapter(CommonAdapter adapter) {
if (adapter != null) {
this.mAdapter = adapter;
if (canMore) {//是否可以加载更多
mLoadMoreWrapper = new LoadMoreWrapper(mAdapter);
mLoadMoreWrapper.setLoadMoreView(R.layout.mycycle_foot_default_loading);
mLoadMoreWrapper.setOnLoadMoreListener(new LoadMoreWrapper.OnLoadMoreListener() {
@Override
public void onLoadMoreRequested() {
/**
* 无论水平还是垂直
*/
if (hasMore && !isLoadMore && !isRefresh && canMore) {
isLoadMore = true;
loadMore();
}
}
}); recyclerView.setAdapter(mLoadMoreWrapper);
} else {
recyclerView.setAdapter(mAdapter);
} mAdapter.setOnItemClickListener(new CommonAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, RecyclerView.ViewHolder holder, int position) {
if (itemClickListener != null)
itemClickListener.onClick(view, holder, position);
} @Override
public boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position) {
if (itemClickListener != null)
itemClickListener.onLongClick(view, holder, position);
return true;
}
});
}
} private void setHasMore(boolean enable) {
this.hasMore = enable;
if (mLoadMoreWrapper!=null)
mLoadMoreWrapper.setFootCanLoad(hasMore);
} /* public boolean isHasMore() {
return hasMore;
} public boolean isCanMore() {
return canMore;
}*/ public boolean isCanMore() {
return canMore;
} public void setCanMore(boolean canMore) {
this.canMore = canMore;
} public void setPullRefreshEnable(boolean enable) {
isCanRefresh = enable;
swipeRfl.setEnabled(enable);
} public boolean getPullRefreshEnable() {
return swipeRfl.isEnabled();
} public void loadMore() {
if (mRefreshLoadMoreListner != null && hasMore && canMore) {
mRefreshLoadMoreListner.onLoadMore();
}
} /**
* 加载更多完毕,为防止频繁网络请求,isLoadMore为false才可再次请求更多数据
*/
public void setLoadMoreCompleted() {
isLoadMore = false;
} public void stopRefresh() {
isRefresh = false;
swipeRfl.setRefreshing(false);
if (isCanRefresh) swipeRfl.setEnabled(true);
} public void setRefreshLoadMoreListener(RefreshLoadMoreListener listener) {
mRefreshLoadMoreListner = listener;
} public void setOnItemClickListener(ItemClickListener listener) {
itemClickListener = listener;
} /**
* 刷新动作,用于请求网络数据
*/
public void refresh() {
swipeRfl.setRefreshing(true);
mExceptView.setVisibility(View.INVISIBLE);
if (mRefreshLoadMoreListner != null) {
mRefreshLoadMoreListner.onRefresh();
}
} public void notifyDataSetChanged() {
//firstload布局只能出现一次,所以这里判断如果显示,就隐藏
if (mLoadingView.getVisibility() == View.VISIBLE) {
recyclerView.setVisibility(View.VISIBLE);
mExceptView.setVisibility(View.INVISIBLE);
mLoadingView.setVisibility(View.INVISIBLE);
}
if (mLoadMoreWrapper != null)
mLoadMoreWrapper.notifyDataSetChanged();
else
mAdapter.notifyDataSetChanged();
} /**
* 第一次自动加载,不与无数据用同样布局是因为,这里要有动画效果,所以单独一个布局
*/
public void firstLoadingView(String exceptStr) { customLoadView(exceptStr);
isRefresh = true;
if (mRefreshLoadMoreListner != null) {
mRefreshLoadMoreListner.onRefresh();
}
} /**
* 获取刷新数据以后的处理
* @param actAllList
* @param tmp
* @param drawableId 当没有数据时提示图片
* @param msg 没有数据时提示语
*/
public void setDateRefresh(List<T> actAllList, List<T> tmp,int drawableId,String msg) {
actAllList.clear();
stopRefresh();//如果刷新则停止刷新
if (tmp==null || tmp.isEmpty()) {
customExceptView(drawableId, msg);
setHasMore(false);
} else {
recyclerView.setVisibility(View.VISIBLE);
setHasMore(true);
actAllList.addAll(tmp);
}
notifyDataSetChanged();//刷新完毕
} /**
* 获取加载更多数据的处理
*
* @param actAllList
* @param tmpLoadmore
*/
public void setDateLoadMore(List<T> actAllList, List<T> tmpLoadmore) {
if (tmpLoadmore==null|| tmpLoadmore.isEmpty()) {
setHasMore(false);//如果没有更多数据则设置不可加载更多
setLoadMoreCompleted();//加载完毕
stopRefresh();//如果刷新则停止刷新
return;
}
setHasMore(true);
actAllList.addAll(tmpLoadmore);
setLoadMoreCompleted();//加载完毕
notifyDataSetChanged();//加载更多完毕
stopRefresh();//如果刷新则停止刷新
} /**
* 刷新数据失败
*
* @param darwable
* @param msg
*/
public void setDateRefreshErr(int darwable, String msg) {
stopRefresh();//如果刷新则停止刷新
customExceptView(darwable, msg);
} public void setLayoutManager(RecyclerView.LayoutManager layoutManager) {
recyclerView.setLayoutManager(layoutManager);
} public void addItemDecoration(RecyclerView.ItemDecoration div) {
recyclerView.addItemDecoration(div);
} /**
* 设置item动画效果
* @param defaultItemAnimator
*/
public void setItemAnimator(RecyclerView.ItemAnimator defaultItemAnimator) {
this.itemAnimator=defaultItemAnimator;
recyclerView.setItemAnimator(itemAnimator);
} /**
* 下拉刷新和自动加载监听
*/
public interface RefreshLoadMoreListener {
public void onRefresh(); public void onLoadMore();
} public interface ItemClickListener {
public void onClick(View view, RecyclerView.ViewHolder holder, int position); public void onLongClick(View view, RecyclerView.ViewHolder holder, int position);
} }
MyRecycleView带有上拉加载更多的更多相关文章
- 原生js移动端touch事件实现上拉加载更多
大家都知道jQuery里没有touch事件,所以在移动端使用原生js实现上拉加载效果还是很不错的,闲话不多说,代码如下: //获取要操作的元素 var objSection = document.ge ...
- H5基于iScroll实现下拉刷新,上拉加载更多
前言 前一段有个手机端的项目需要用到下拉刷新和上拉加载更多的效果,脑海里第一反映就是微博那种效果,刚开始的理解有些偏差,以为下拉也是追加数据,上拉也是追加数据,后请教同事后发现其实下拉只是刷新最新数据 ...
- 常见开发需求之angular上拉加载更多
需求 移动端使用angular实现上拉加载更多的条目,这个需求比较常见,网上的插件改动起来比较麻烦,不如自己写一个最适合,以前有同事写了一个,奈何bug太多,后来改分页了,我们产品说什么都让做,没 ...
- ListView实现Item上下拖动交换位置 并且实现下拉刷新 上拉加载更多
ListView实现Item上下拖动交换位置 并且实现下拉刷新 上拉加载更多 package com.example.ListViewDragItem; import android.app.Ac ...
- ionic 上拉加载更多&瀑布流加载&滚动到底部加载更多 主意事项
首先下拉刷新的代码是这样的,标红的地方为关键代码 <html> <head> <meta charset="utf-8"> <meta n ...
- android ListView下拉刷新 上拉加载更多
背景 最近在公司的项目中要使用到ListView的下拉刷新和上拉加载更多(貌似现在是个项目就有这个功能!哈哈),其实这个东西GitHub上很多,但是我感觉那些框架太大,而且我这个项目只用到了ListV ...
- Android 上拉加载更多功能
前几天看了github上面的例子,参照它的实现,自己又稍微改了一点,往项目里面增加了一个上拉加载更多功能.具体的实现如下: 首先要重写ListView: import android.content. ...
- android ListView上拉加载更多 下拉刷新功能实现(采用pull-to-refresh)
Android实现上拉加载更多功能以及下拉刷新功能, 采用了目前比较火的PullToRefresh,他是目前实现比较好的下拉刷新的类库. 目前他支持的控件有:ListView, ExpandableL ...
- RecyclerView实例-实现可下拉刷新上拉加载更多并可切换线性流和瀑布流模式(1)
摘要 最近项目有个列表页需要实现线性列表和瀑布流展示的切换,首先我想到的就是上 [RecyclerView],他本身已经很好的提供了三种布局方式,只是简单做个切换应该是很简单的事情,如果要用Recyc ...
随机推荐
- JS实现禁用滑动条但滑动条不消失的效果
//方法 //滑动条 // left: 37, up: 38, right: 39, down: 40, // spacebar: 32, pageup: 33, pagedown: 34, end: ...
- android版本vqmon移植IOS版
IOS交叉编译 1.android版本 vqmon已经正常运行,现需要开放IOS版本,作移植工作. 2. 注意事项: 1)ROOT权限,IOS必须越狱. 2)依赖库:pcap, ffmpeg,lib ...
- 实现jQuery的$.extend方法
var o1 = { hello : 1, old : 555 }, o2 = { abc : 55555555, hello : 2, fun : function() { alert(111); ...
- 示例解读Java的跨平台原理
首先简单的解释一下Java跨平台的特征,相当于说写一个Java程序论述上可以运行在不同的操作系统平台上面(此处的平台我们就简单的看成是操作系统平台).下面我们用一些事例来说明它的好处. 我们先了解一些 ...
- Python 高级 I/O 多路复用
Table of Contents 前言 select selectors 结语 参考链接 前言 第一次接触和 I/O 多路复用相关的概念是在书 CSAPP1 的并发编程章节,当时在了解了这个概念后只 ...
- python 学习分享-实战篇高级的ftp
#server代码 import socketserver,os,hashlib Base_paht = os.path.dirname(os.path.dirname(os.path.abspath ...
- 孤荷凌寒自学python第二十天python的匿名函数与偏函数
孤荷凌寒自学python第二十天python的匿名函数与偏函数 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Python为使函数的使用更加方便高效,可以使用两种特殊的函数简化语句书写. 一 ...
- 【视觉SLAM14讲】ch3课后题答案
1.验证旋转矩阵是正交矩阵 感觉下面这篇博客写的不错 http://www.cnblogs.com/caster99/p/4703033.html 总结一下:旋转矩阵是一个完美的矩阵——正交矩阵.①行 ...
- Python 第一周编程作业
一. 编程题 1. 结合turtle库使用手册,读懂下列代码,并在jupyter编译器中运行观察结果: 依次分析下代码: 第一行 通过保留字import引用了Python中用于绘制图形的turtl ...
- Android详细目录结构
Android 2.1 |-- Makefile |-- bionic (bionic C库) |-- bootable (启动引导相关代码) |-- build (存放系统编译规则及generic等 ...