android 支持上拉加载,下拉刷新的列表控件SwipeRefreshLayout的二次封装
上拉加载,下拉刷新的列表控件,大家一定都封装过,或者使用过
源代码,我会在最后贴出来
这篇代码主要是为了解决两个问题
1.滑动冲突得问题
2.listview无数据时,无数据布局的展示问题
下方列出的代码,主要就是为了解决listview与父布局之间的滑动冲突
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
private boolean mIsEnd = false;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (mOnScrollListener != null) {
mOnScrollListener.onScrollStateChanged(view, scrollState);
}
if (scrollState == SCROLL_STATE_IDLE) {
//1:到达底部 2:底部当前可以加载更多 3:顶部不在刷新中状态
Log.i("syntapp", mIsEnd + "===" + mLoadMoreStatus + "====" + isRefreshing());
if (mIsEnd && mLoadMoreStatus == LoadMoreStatus.CLICK_TO_LOAD && !isRefreshing()) {
setLoadMoreStatus(LoadMoreStatus.LOADING);
if (mLoadMoreStatus != null) {
mOnLoadListener.onLoad(false);
}
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (mOnScrollListener != null) {
mOnScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
}
mIsEnd = firstVisibleItem + visibleItemCount >= totalItemCount - 1;
if (mOnMyScrollListener != null) {
mOnMyScrollListener.onScrollItem(firstVisibleItem, visibleItemCount, totalItemCount);
}
}
});
super.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
if (mLoadMoreStatus != LoadMoreStatus.LOADING) {
if (mOnLoadListener != null) {
mOnLoadListener.onLoad(true);
// mEmptyView.setVisibility(GONE);
}
} else {
SimpleListView.super.setRefreshing(false);
}
}
});
那么接下来我们来解决listView的恐怖剧展示问题
//1.我们需要添加一个空布局的显示,这里的activity_no_data可以根据自己的实际需要去设计
mEmptyView = LayoutInflater.from(context).inflate(R.layout.activity_no_data, null);
mListView = new ListView(context, attrs);
FrameLayout rl = new FrameLayout(context);
rl.addView(mEmptyView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
rl.addView(mListView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
addView(rl);
//2.我们需要解决listview在上拉加载和下拉刷新的触摸事件,让我们想要的的触摸极致点位与代码上的判断重合
mListView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE) {
if (mListView.getChildAt(0) != null && mListView.getFirstVisiblePosition() == 0 &&
mListView.getChildAt(0).getTop() >= 0) {//或者 listView.getChildAt(0).getTop() >= listView.getListPaddingTop())
((ViewGroup) ((ViewGroup) mListView.getParent()).getParent()).setEnabled(true);
Log.d("TAG", "reach top!!!");
} else {
if (mListView.getAdapter().getCount() == 0) {
((ViewGroup) ((ViewGroup) mListView.getParent()).getParent()).setEnabled(true);
} else {
((ViewGroup) ((ViewGroup) mListView.getParent()).getParent()).setEnabled(false);
}
Log.d("TAG", "not reach top!!!");
}
}
return false;
}
});
接下来,我贴出来全部的代码段,当然了,这里面还是有很多无用的代码段,根据自己的实际需求去增删吧
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.database.DataSetObserver;
import android.os.Parcelable;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.avicsafety.lib.R;
public class SimpleListView extends SwipeRefreshLayout {
private ListView mListView;
private LoadMoreStatus mLoadMoreStatus = LoadMoreStatus.CLICK_TO_LOAD;
private OnLoadListener mOnLoadListener;
private OnMyScrollListener mOnMyScrollListener;
private TextView mLoadMoreView;
private AbsListView.OnScrollListener mOnScrollListener;
private View mEmptyView;
private ListAdapter mAdapter;
private float startY;
private float startX;
// 记录viewPager是否拖拽的标记
private boolean mIsVpDragger;
private int mTouchSlop;
/**
* 加载更多状态
*/
public enum LoadMoreStatus {
/**
* 点击加载更多
*/
CLICK_TO_LOAD,
/**
* 正在加载
*/
LOADING,
/**
* 没有更多内容了
*/
LOADED_ALL
}
/**
* 加载监听器
*/
public interface OnLoadListener {
/**
* 下来刷新或者加载更多时触发该回调
*
* @param isRefresh true为下拉刷新 false为加载更多
*/
void onLoad(boolean isRefresh);
}
public interface OnMyScrollListener {
void onScrollItem(int firstVisibleItem, int visibleItemCount, int totalItemCount);
}
public SimpleListView(Context context) {
super(context);
init(context, null);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
public SimpleListView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
mEmptyView = LayoutInflater.from(context).inflate(R.layout.activity_no_data, null);
emptyView = mEmptyView;
mListView = new ListView(context, attrs);
FrameLayout rl = new FrameLayout(context);
rl.addView(mEmptyView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
rl.addView(mListView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT
android 支持上拉加载,下拉刷新的列表控件SwipeRefreshLayout的二次封装的更多相关文章
- RecyclerView 上拉加载下拉刷新
RecyclerView 上拉加载下拉刷新 <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/teach_s ...
- Vue mint ui用在消息页面上拉加载下拉刷新loadmore 标记
之前总结过一个页面存在多个下拉加载的处理方式,今天再来说一下在消息页面的上拉加载和下拉刷新,基本上每个app都会有消息页面,会遇到这个需求 需求:每次加载十条数据,上拉加载下拉刷新,并且没有点击查看过 ...
- 上拉加载下拉刷新控件WaterRefreshLoadMoreView
上拉加载下拉刷新控件WaterRefreshLoadMoreView 效果: 源码: // // SRSlimeView // @author SR // Modified by JunHan on ...
- APICloud上啦加载下拉刷新模块
apicloud有自带的上啦加载下拉刷新,当让也可以用第三方或者在模块库里面找一个使用 一.下拉刷新,一下代码写在 apiready = function (){} 里面 apiready = fun ...
- 微信小程序上拉加载下拉刷新
微信小程序实现上拉加载下拉刷新 使用小程序默认提供方法. (1). 在xxx.json 中开启下拉刷新,需要设置backgroundColor,或者是backgroundTextStyle ,因为加载 ...
- mui scroll和上拉加载/下拉刷新
mui中 scroll和上拉加载/下拉刷新同时存在会出现两个滚动条 把/* */ /* //mui页面鼠标拖动代码: mui('.mui-scroll-wrapper').scroll({ dec ...
- 利用iscroll实现上拉加载下拉刷新
1.首先引用isScroll插件 说明:页面加载时初始化isScroll,然后调用pullDownAction()和pullUpAction(),每次切换tab时,只需要对pullDownAction ...
- 移动端上拉加载下拉刷新插件-mescroll.js插件
官网地址是:http://www.mescroll.com // 初始化mescroll function initMeScroll() { //创建MeScroll对象,内部已默认开启下拉刷新,自动 ...
- Flutter上拉加载下拉刷新---flutter_easyrefresh
前言 Flutter默认不支持上拉加载,下拉刷新也仅仅支持Material的一种样式.Android开发使用过SmartRefreshLayout的小伙伴都知道这是一个强大的刷新UI库,集成了很多出色 ...
随机推荐
- 计算几何-点与多边形的位置判断-zoj1081Points Within
This article is made by Jason-Cow.Welcome to reprint.But please post the writer's address. http://ww ...
- Maven快速创建SpringMVC web(1)
Maven快速创建SpringMVC web工程详解 转自:http://blog.csdn.net/cndmss/article/details/52184836
- 主席树 hdu 4348
题意:有一个由n个数组成的序列,有4中操作: 1.C l r d [l,r]这段区间都加上d 2.Q l r 询问[l,r]这段区间的和 3.H l r t 询问之前t时间[l,r]的区间和 4.B ...
- 用eclipse发布springboot项目
使用eclipse打包springboot项目时一直报错 [ERROR] No compiler is provided in this environment. Perhaps you are ru ...
- C9300升级-USB
1.show ver查看设备的版本 2.一些版本信息的参考 3.准备USB查看其具备的镜像命令:dir usbflash0: 4.复制镜像到设备命令:copy usbflash0:cat9k_iosx ...
- 项目出现红色感叹号, pom.xml并出错
问题描述: eclipse出现红色感叹号,pom.xml 文件也报错 但没有提示具体是那里出错了. 打开 Java Build Path 找到 Librarices 你在看到 Maven Dep ...
- 508,css优先级算法如何计算?
优先级就近原则,同权情况下样式定义最近者为准 载入样式以最后载入的定位为准 优先级:!important>id > class >tag; !important比内联优先级高 (百 ...
- 对于使用secureFX上传文件到centos7 的时候,以及不同的用户解压文件,对于文件操作权限的实验
本以为以一个用户胡如root登录了SecureFx,之后选择了root的家目录下的一个software目录,之后上传 以root用户远程登录LINUX系统 查看文件 之后再验证普通用户zhaijh登录 ...
- python获取进程id号:
python获取进程id号: os.getpid()获取当前进程id os.getppid()获取父进程id
- STM32F103之USART学习记录
1.USART的主要特性 1)名称:串行异步通信接口 2)全双工.异步通信 3)发送和接收速率最高可达4.5MBits/s 4)可编程数据长度8或9bits 5)可配置的停止位:支持1或2位停止位 6 ...