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 ...
随机推荐
- Ubuntu 14.10 配置JDK + J2EE
本文仅作为本人在Ubuntu 14.10下安装JDK + J2EE的一个记录: 安装JDK 从Oracle的官网下载jdk-7u75-linux-x64.tar.gz 将jdk-7u75-linux- ...
- Android 使用Retrofit2.0+OkHttp3.0实现缓存处理+Cookie持久化第三方库
1.Retrofit+OkHttp的缓存机制 1.1.第一点 在响应请求之后在 data/data/<包名>/cache 下建立一个response 文件夹,保存缓存数据. 1.2.第二点 ...
- 20145202马超GDB调试汇编堆栈过程分析
20145202马超GDB调试汇编堆栈过程分析 esc :w保存,:wq保存并退出 x:删除错误的单个字母 dw:删除整个单词 gcc hello.c -o hello:运行hello.c gcc - ...
- 5,MongoDB 之 "$" 的奇妙用法
在MongoDB中有一个非常神奇的符号 "$" "$" 在 update 中 加上关键字 就 变成了 修改器 其实 "$" 字符 独立出现 ...
- CodeForces 771C Bear and Tree Jumps 树形DP
题意: 给出一棵树,一个人可以在树上跳,每次最多跳\(k(1 \leq k \leq 5)\)个点 定义\(f(s,t)\)为从顶点\(s\)跳到顶点\(t\)最少需要跳多少次 求\(\sum\lim ...
- 解决Android Studio报错:DefaultAndroidProject : Unsupported major.minor version 52.0
解决办法是你需要将工程根目录build.gradle中的 classpath 'com.android.tools.build:gradle:2.2.0' 更改成 classpath 'com.and ...
- 【Insert Interval】cpp
题目: Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if nec ...
- Unity-SendMessage
每一个对象都有SendMessage,BroadcastMessage,SendMessageUpwards 三个发送消息的方法! 1.功能: 执行某个对象中的某个方法! 2.实现原理 反射 ...
- Python全栈工程师(面向对象)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python人工智能从入门到精通 day16补充: 异常处理 文件 ...
- Python下安装protobuf
1. 下载安装包 2. 解压缩 tar –xzvf protobuf-2.6.1.tar.gz 3. 安装protoc 在python中使用protocbuf需要Protocal Buffer 编译器 ...