效果图:

               

java代码中:

public class MainActivity extends Activity implements OnRefreshListener,OnLoadListener {private RefreshLayout swipeLayout;private ListView listView;private MyAdapter adapter;private ArrayList<HashMap<String, String>> list;private View header;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();setData();setListener();}private void initView() {header = getLayoutInflater().inflate(R.layout.header, null);swipeLayout = (RefreshLayout) findViewById(R.id.swipe_container);swipeLayout.setOnRefreshListener(this);swipeLayout.setColorScheme(android.R.color.holo_blue_bright,android.R.color.holo_green_light,android.R.color.holo_orange_light,android.R.color.holo_red_light);}private void setData() {list = new ArrayList<HashMap<String, String>>();for (int i = 0; i < 20; i++) {list.add(new HashMap<String, String>());}listView = (ListView) findViewById(R.id.list);//listView.addHeaderView(header);adapter = new MyAdapter(this, list);listView.setAdapter(adapter);}private void setListener() {swipeLayout.setOnRefreshListener(this);swipeLayout.setOnLoadListener(this);}/*** 下拉加载更新数据*/@Overridepublic void onRefresh() {swipeLayout.postDelayed(new Runnable() {@Overridepublic void run() {// 更新数据// 更新完后调用该方法结束刷新swipeLayout.setRefreshing(false);}}, 3000);}/*** 上拉加载更新数据*/@Overridepublic void onLoad() {swipeLayout.postDelayed(new Runnable() {@Overridepublic void run() {// 更新数据// 更新完后调用该方法结束刷新swipeLayout.setLoading(false);}}, 5000);}}

activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><com.example.swiperefreshlayoutdemo.RefreshLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/swipe_container"android:layout_width="match_parent"android:layout_height="match_parent" ><ListViewandroid:id="@+id/list"android:layout_width="match_parent"android:layout_height="match_parent" ></ListView></com.example.swiperefreshlayoutdemo.RefreshLayout></RelativeLayout>

这里使用到了一个自定义的Swiperefreshlayout

import android.content.Context;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;/*** 继承自SwipeRefreshLayout,从而实现滑动到底部时上拉加载更多的功能.* * @author mrsimple*/
public class RefreshLayout extends SwipeRefreshLayout implementsOnScrollListener {/*** 滑动到最下面时的上拉操作*/private int mTouchSlop;/*** listview实例*/private ListView mListView;/*** 上拉监听器, 到了最底部的上拉加载操作*/private OnLoadListener mOnLoadListener;/*** ListView的加载中footer*/private View mListViewFooter;/*** 按下时的y坐标*/private int mYDown;/*** 抬起时的y坐标, 与mYDown一起用于滑动到底部时判断是上拉还是下拉*/private int mLastY;/*** 是否在加载中 ( 上拉加载更多 )*/private boolean isLoading = false;/*** @param context*/public RefreshLayout(Context context) {this(context, null);}public RefreshLayout(Context context, AttributeSet attrs) {super(context, attrs);mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();mListViewFooter = LayoutInflater.from(context).inflate(R.layout.listview_footer, null, false);}@Overrideprotected void onLayout(boolean changed, int left, int top, int right,int bottom) {super.onLayout(changed, left, top, right, bottom);// 初始化ListView对象if (mListView == null) {getListView();}}/*** 获取ListView对象*/private void getListView() {int childs = getChildCount();if (childs > 0) {View childView = getChildAt(0);if (childView instanceof ListView) {mListView = (ListView) childView;// 设置滚动监听器给ListView, 使得滚动的情况下也可以自动加载mListView.setOnScrollListener(this);Log.d(VIEW_LOG_TAG, "### 找到listview");}}}/** (non-Javadoc)* * @see android.view.ViewGroup#dispatchTouchEvent(android.view.MotionEvent)*/@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {final int action = event.getAction();switch (action) {case MotionEvent.ACTION_DOWN:// 按下mYDown = (int) event.getRawY();break;case MotionEvent.ACTION_MOVE:// 移动mLastY = (int) event.getRawY();break;case MotionEvent.ACTION_UP:// 抬起if (canLoad()) {loadData();}break;default:break;}return super.dispatchTouchEvent(event);}/*** 是否可以加载更多, 条件是到了最底部, listview不在加载中, 且为上拉操作.* * @return*/private boolean canLoad() {return isBottom() && !isLoading && isPullUp();}/*** 判断是否到了最底部*/private boolean isBottom() {if (mListView != null && mListView.getAdapter() != null) {return mListView.getLastVisiblePosition() == (mListView.getAdapter().getCount() - 1);}return false;}/*** 是否是上拉操作* * @return*/private boolean isPullUp() {return (mYDown - mLastY) >= mTouchSlop;}/*** 如果到了最底部,而且是上拉操作.那么执行onLoad方法*/private void loadData() {if (mOnLoadListener != null) {// 设置状态setLoading(true);//mOnLoadListener.onLoad();}}/*** @param loading*/public void setLoading(boolean loading) {isLoading = loading;if (isLoading) {mListView.addFooterView(mListViewFooter);} else {mListView.removeFooterView(mListViewFooter);mYDown = 0;mLastY = 0;}}/*** @param loadListener*/public void setOnLoadListener(OnLoadListener loadListener) {mOnLoadListener = loadListener;}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {// 滚动时到了最底部也可以加载更多if (canLoad()) {loadData();}}/*** 加载更多的监听器* * @author mrsimple*/public static interface OnLoadListener {public void onLoad();}
}

Android ListView下拉与上拉刷新加载更多数据 二相关推荐

  1. 【微信小程序】实现下拉刷新和上拉触底加载更多数据的页面事件

    1.下拉刷新事件 1. 什么是下拉刷新 下拉刷新是移动端的专有名词,指的是通过手指在屏幕上的下拉滑动操作,从而重新加载页面数据的行为 2. 启用下拉刷新 启用下拉刷新有两种方式: ① 全局开启下拉刷新 ...

  2. Flutter下拉刷新,上拉加载更多数据

    下拉刷新 很简单,直接使用 RefreshIndicator 组件, onRefresh 为重新获取数据的方法 Widget build(BuildContext context) {return S ...

  3. 微信小程序如何实现上拉加载更多数据?

    思路:在下拉到页面的时候我们可以进行数据请求,请求到在上次加载完毕的后五条数据 (举个例子),通过page(页码),count(加载数据得条数)与start进行联接,我们可以发现:start:(pag ...

  4. 使用iScroll实现上、下滑动刷新和加载更多数据

    1.下载iScorll v4.2.5,引用其中的iscroll.js 2.html: 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 & ...

  5. ASP.NET仿新浪微博下拉加载更多数据瀑布流效果

    闲来无事,琢磨着写点东西.貌似页面下拉加载数据,瀑布流的效果很火,各个网站都能见到各式各样的展示效果,原理大同小异.于是乎,决定自己写一写这个效果,希望能给比我还菜的菜鸟们一点参考价值.       ...

  6. 微信小程序上拉加载 加载更多数据 触底加载 点击加载更多数据

    开发需求 进入页面,加载初始数据,当向上拖动页面至底部,自动加载新的数据,即上拉加载更多数据. 演示 index.wxml <!-- 数据列表 --> <view wx:for=&q ...

  7. 小程序下拉加载更多数据

    1    功能介绍 1.1    简单列表分页 功能描述:拖动下拉条,可以加载更多内容 1.1.1    实现步骤 1.1.1.1    配置.json文件 1)    在app.json页面配置&q ...

  8. 小程序上拉加载更多数据

    本人也是新手进行刚刚接触小程序然后需要一个上拉加载数据的代码,百度看了一下自己做出一点总结希望可以帮助跟我一样入坑的新手 首先是页面.wxml代码 <!--上拉刷新加载--> <pa ...

  9. uniapp微信小程序uni-load-more上拉加载更多数据

    1.引入uni-app中uni-load-more.vue到自己的项目 import uniLoadMore from '@/components/uni-load-more/uni-load-mor ...

最新文章

  1. ASP.NET Session 详解
  2. python在linux报错xe6,python出现SyntaxError: Non-ASCII character '\xe6' in file \的错误
  3. python代码打好了怎么运行-python代码是怎样运行的
  4. bzoj2190 [SDOI2008]仪仗队(欧拉函数)
  5. 禁止php 报错怎么做,php – 禁用Laravel错误处理程序
  6. ITK:从体积生成切片
  7. python创建新工程_个人博客二|创建项目
  8. 微信小程序自定义波浪组件
  9. 大数据之-入门_大数据部门组织结构(重点)---大数据之hadoop工作笔记0007
  10. uc点网页显示服务器升级,让uc浏览器网页加载速度提升100%
  11. Android 移动开发知识体系
  12. Hive基本查询语法
  13. 【对话】对话系统经典:检索式对话
  14. 查看Linux是Redhat 还是centos 还是...
  15. php 文件服务器,GitHub - RainmanJin/PSFS: PHP Simple File Server 极简版PHP文件服务器
  16. 【SaaS】企业微信裂变系统引流变现系统产品介绍
  17. 金禄电子通过注册:年营收13亿 二股东麦睿明因走私被判刑
  18. KDD 2022 | 美团技术团队精选论文解读
  19. Centos7设置1920x1080分辨率
  20. 英文wiki技术基础问题查询的常见问题

热门文章

  1. 旷视研究院张弛:行人重识别及其应用
  2. 性能比拼!超详细的Tengine GEMM矩阵乘法汇编教程
  3. 【资源下载】DeepMindUCL深度学习与强化学习进阶课程
  4. 【3D游戏建模】3D建模师的发展前景
  5. 【深度学习系列】——神经网络的可视化解释
  6. 综述 | 卷积神经网络表征可视化研究
  7. 2020 ACM Fellow放榜!陈怡然、颜水成、周昆等12名华人当选
  8. 机器学习经典算法决策树原理详解(简单易懂)
  9. 解决Python中sum函数出现的TypeError: unsupported operand type(s) for +: 'int' and 'list'错误问题
  10. 批量读写变换图片(转)