上拉加载,下拉刷新的列表控件,大家一定都封装过,或者使用过

源代码,我会在最后贴出来

这篇代码主要是为了解决两个问题

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的二次封装的更多相关文章

  1. RecyclerView 上拉加载下拉刷新

    RecyclerView 上拉加载下拉刷新 <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/teach_s ...

  2. Vue mint ui用在消息页面上拉加载下拉刷新loadmore 标记

    之前总结过一个页面存在多个下拉加载的处理方式,今天再来说一下在消息页面的上拉加载和下拉刷新,基本上每个app都会有消息页面,会遇到这个需求 需求:每次加载十条数据,上拉加载下拉刷新,并且没有点击查看过 ...

  3. 上拉加载下拉刷新控件WaterRefreshLoadMoreView

    上拉加载下拉刷新控件WaterRefreshLoadMoreView 效果: 源码: // // SRSlimeView // @author SR // Modified by JunHan on ...

  4. APICloud上啦加载下拉刷新模块

    apicloud有自带的上啦加载下拉刷新,当让也可以用第三方或者在模块库里面找一个使用 一.下拉刷新,一下代码写在 apiready = function (){} 里面 apiready = fun ...

  5. 微信小程序上拉加载下拉刷新

    微信小程序实现上拉加载下拉刷新 使用小程序默认提供方法. (1). 在xxx.json 中开启下拉刷新,需要设置backgroundColor,或者是backgroundTextStyle ,因为加载 ...

  6. mui scroll和上拉加载/下拉刷新

    mui中 scroll和上拉加载/下拉刷新同时存在会出现两个滚动条 把/*   */ /* //mui页面鼠标拖动代码: mui('.mui-scroll-wrapper').scroll({ dec ...

  7. 利用iscroll实现上拉加载下拉刷新

    1.首先引用isScroll插件 说明:页面加载时初始化isScroll,然后调用pullDownAction()和pullUpAction(),每次切换tab时,只需要对pullDownAction ...

  8. 移动端上拉加载下拉刷新插件-mescroll.js插件

    官网地址是:http://www.mescroll.com // 初始化mescroll function initMeScroll() { //创建MeScroll对象,内部已默认开启下拉刷新,自动 ...

  9. Flutter上拉加载下拉刷新---flutter_easyrefresh

    前言 Flutter默认不支持上拉加载,下拉刷新也仅仅支持Material的一种样式.Android开发使用过SmartRefreshLayout的小伙伴都知道这是一个强大的刷新UI库,集成了很多出色 ...

随机推荐

  1. 线性筛-mobius,强大O(n)

    首先,你要知道什么是莫比乌斯函数 然后,你要知道什么是积性函数 最后,你最好知道什么是线性筛 莫比乌斯反演 积性函数 线性筛,见上一篇 知道了,就可以愉快的写mobius函数了 由定义: μ(n)= ...

  2. Spring Boot框架 - 数据访问 - 整合Mybatis

    一.新建Spring Boot项目 注意:创建的时候勾选Mybatis依赖,pom文件如下 <dependency> <groupId>org.mybatis.spring.b ...

  3. Navicat Premium 12安装、激活

    Navicat Premium 12安装 Navicat Premium 12激活

  4. python-线程池的两种实现方式 【转载】

    #!/usr/bin/env python # -*- coding:utf-8 -*- import queue import threading import contextlib import ...

  5. php从接口获取数据转成可以用的数组或其他(含转换编码)

    程序开发,时常会用到将接口的json数据转换成程序可以用的,因为今天看到一个比较好的程序,贴上来,以备随时查看: /** * 将对象转成数组,并按要求转换编码 * * @param array $ar ...

  6. vue实现数据遍历、多个倒计时列表

    移动端效果图: 1.HTML显示代码: <template> <div class="activeList"> <div class="li ...

  7. ajax中 踩过的坑

    直接上图:  以前一直对  dataType  这个参数  模棱两可,只知道一般写的是 json 正解:这个dateType  指的是 ajax  返回数据的格式.比如:你想返回一个“success& ...

  8. 【C语言】逗号运算符的使用举例

    #include<stdio.h> int main(void) { , b = , c = , y, z; y = a + b, a + c;/*由y=a+b和a+c组成的逗号表达式*/ ...

  9. P1579

    AC: #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for(int i = a; i < b ...

  10. Kosaraju's algorithm

    推荐到我的这篇博客中看完整版的. 该算法用于求解有向图的强连通分量,也就是强连通子图的个数. 算法实现摘自Kosaraju's algorithm - 百度百科: #include <iostr ...