ListView封装实现下拉刷新和上拉加载(方式2)(转载)
转自:http://blog.csdn.net/jdfkldjlkjdl/article/details/70229465
这次使用的是系统的SwipeRefreshLayout实现下拉刷新,和设置ListView的滑动监听判断是否滑动到最底部然后加载更多;如果想了解用另一种方式实现这个功能,请移步http://blog.csdn.net/jdfkldjlkjdl/article/details/51277941
其中,SwipeRefreshLayout的几个方法功能如下:
1、setOnRefreshListener():设置手势滑动监听器。
2、setProgressBackgroundColor():设置进度圈的背景色。
3、setColorSchemeResources():设置进度动画的颜色。
4、setRefreshing():设置组件的刷洗状态。
5、setSize():设置进度圈的大小
下面说一下实现步骤:
1.添加布局文件
- <android.support.v4.widget.SwipeRefreshLayout
- android:id="@+id/mSwipeRefreshLayout"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <ListView
- android:id="@+id/mListView"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:divider="#cccccc"
- android:dividerHeight="1px"/>
- </android.support.v4.widget.SwipeRefreshLayout>
2.添加加载更多的布局文件load_more.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/ll_load_more"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:layout_margin="10dip"
- android:gravity="center_vertical"
- android:orientation="horizontal">
- <ProgressBar
- android:layout_width="30dp"
- android:layout_height="30dp"
- android:layout_gravity="center"
- />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="10dip"
- android:text="加载更多"
- android:textColor="#bbb"
- android:textSize="12sp"/>
- </LinearLayout>
- </LinearLayout>
3.绑定下拉刷新事件
- //设置手势监听
- mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
- @Override
- public void onRefresh() {
- mHandler.sendEmptyMessageDelayed(REFRESH, 2000);
- }
- });
4.绑定上拉加载更多事件
- //给listview设置一个滑动的监听
- mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
- int visibleLastIndex = 0; //最后的可视项索引
- int visibleItemCount; // 当前窗口可见项总数
- //当滑动状态发生改变的时候执行
- public void onScrollStateChanged(AbsListView view, int scrollState) {
- switch (scrollState) {
- //当不滚动的时候
- case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
- int itemsLastIndex = adapter.getCount() - 1; //数据集最后一项的索引
- int lastIndex = itemsLastIndex + 1; //加上底部的loadMoreView项
- //判断是否是最底部
- //if (view.getLastVisiblePosition() == (view.getCount()) - 1) { //或者
- if (visibleLastIndex == lastIndex) {
- loadMoreView.setVisibility(View.VISIBLE);
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- //加载网络数据
- Message msg = new Message();
- msg.what = LOADMORE;
- msg.arg1 = visibleLastIndex - visibleItemCount + 1;
- mHandler.sendMessage(msg);
- }
- }, 2000);
- }
- break;
- }
- }
- //正在滑动的时候执行
- public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
- this.visibleItemCount = visibleItemCount;
- visibleLastIndex = firstVisibleItem + visibleItemCount - 1;
- }
- });
完整的activity代码如下:
- package demo.xzy.qh.com.listviewpulltorefreshandloadmore;
- import android.app.Activity;
- import android.graphics.Color;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.support.v4.widget.SwipeRefreshLayout;
- import android.view.View;
- import android.widget.AbsListView;
- import android.widget.ArrayAdapter;
- import android.widget.ListView;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * ListView下拉刷新,上拉加载demo
- */
- public class MainActivity extends Activity {
- private SwipeRefreshLayout mSwipeRefreshLayout;
- private ListView mListView;
- private List<String> data = new ArrayList<>();
- private ArrayAdapter<String> adapter;
- private static final int REFRESH = 0x01;
- private static final int LOADMORE = 0x02;
- private View loadMoreView;
- private Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- switch (msg.what) {
- case REFRESH:
- data.add(0, "刷新得到的数据");
- adapter.notifyDataSetChanged();
- mSwipeRefreshLayout.setRefreshing(false);
- break;
- case LOADMORE:
- for (int x = 0; x < 5; x++) {
- data.add(data.size(), "aaaaaa" + x);
- }
- adapter.notifyDataSetChanged(); //数据集变化后,通知adapter
- int position = msg.arg1;
- mListView.setSelection(position); //设置选中项
- loadMoreView.setVisibility(View.GONE);
- break;
- }
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- for (int i = 0; i < 6; i++) {
- data.add("测试数据" + i);
- }
- initView();
- }
- private void initView() {
- mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.mSwipeRefreshLayout);
- mListView = (ListView) findViewById(R.id.mListView);
- loadMoreView = getLayoutInflater().inflate(R.layout.load_more, null);
- loadMoreView.setVisibility(View.GONE);
- mListView.addFooterView(loadMoreView);
- mListView.setFooterDividersEnabled(false);
- //设置进度圈的大小;(这里面只有两个值SwipeRefreshLayout.LARGE和DEFAULT,后者是默认效果)
- mSwipeRefreshLayout.setSize(SwipeRefreshLayout.DEFAULT);
- //设置进度圈的背景色。这里随便给他设置了一个颜色:浅绿色
- mSwipeRefreshLayout.setProgressBackgroundColorSchemeColor(Color.CYAN);
- //设置进度动画的颜色。这里面最多可以指定四个颜色,我这也是随机设置的,大家知道怎么用就可以了
- mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_orange_dark
- , android.R.color.holo_blue_dark
- , android.R.color.holo_red_dark
- , android.R.color.widget_edittext_dark);
- adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, data);
- mListView.setAdapter(adapter);
- //设置手势监听
- mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
- @Override
- public void onRefresh() {
- mHandler.sendEmptyMessageDelayed(REFRESH, 2000);
- }
- });
- //给listview设置一个滑动的监听
- mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
- int visibleLastIndex = 0; //最后的可视项索引
- int visibleItemCount; // 当前窗口可见项总数
- //当滑动状态发生改变的时候执行
- public void onScrollStateChanged(AbsListView view, int scrollState) {
- switch (scrollState) {
- //当不滚动的时候
- case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
- int itemsLastIndex = adapter.getCount() - 1; //数据集最后一项的索引
- int lastIndex = itemsLastIndex + 1; //加上底部的loadMoreView项
- //判断是否是最底部
- //if (view.getLastVisiblePosition() == (view.getCount()) - 1) { //或者
- if (visibleLastIndex == lastIndex) {
- loadMoreView.setVisibility(View.VISIBLE);
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- //加载网络数据
- Message msg = new Message();
- msg.what = LOADMORE;
- msg.arg1 = visibleLastIndex - visibleItemCount + 1;
- mHandler.sendMessage(msg);
- }
- }, 2000);
- }
- break;
- }
- }
- //正在滑动的时候执行
- public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
- this.visibleItemCount = visibleItemCount;
- visibleLastIndex = firstVisibleItem + visibleItemCount - 1;
- }
- });
- }
- }
整个demo很简单,就两个布局文件和一个activity。
至此,标题中提到的功能已经实现。欢迎留言指正。
ListView封装实现下拉刷新和上拉加载(方式2)(转载)的更多相关文章
- android--------自定义控件ListView实现下拉刷新和上拉加载
开发项目过程中基本都会用到listView的下拉刷新和上滑加载更多,为了方便重写的ListView来实现下拉刷新,同时添加了上拉自动加载更多的功能. Android下拉刷新可以分为两种情况: 1.获取 ...
- Diycode开源项目 搭建可以具有下拉刷新和上拉加载的Fragment
1.效果预览 1.1.这个首页就是一个Fragment碎片,本文讲述的就是这个碎片的搭建方式. 下拉会有一个旋转的刷新圈,上拉会刷新数据. 1.2.整体结构 首先底层的是BaseFragment 然后 ...
- Android 5.X新特性之为RecyclerView添加下拉刷新和上拉加载及SwipeRefreshLayout实现原理
RecyclerView已经写过两篇文章了,分别是Android 5.X新特性之RecyclerView基本解析及无限复用 和 Android 5.X新特性之为RecyclerView添加Header ...
- Android 使用PullToRefresh实现下拉刷新和上拉加载(ExpandableListView)
PullToRefresh是一套实现非常好的下拉刷新库,它支持: 1.ListView 2.ExpandableListView 3.GridView 4.WebView 等多种常用的需要刷新的Vie ...
- 使用PullToRefresh实现下拉刷新和上拉加载
使用PullToRefresh实现下拉刷新和上拉加载 分类: Android2013-12-20 15:51 78158人阅读 评论(91) 收藏 举报 Android下拉刷新上拉加载PullToRe ...
- 安卓开发笔记——关于开源组件PullToRefresh实现下拉刷新和上拉加载(一分钟搞定,超级简单)
前言 以前在实现ListView下拉刷新和上拉加载数据的时候都是去继承原生的ListView重写它的一些方法,实现起来非常繁杂,需要我们自己去给ListView定制下拉刷新和上拉加载的布局文件,然后添 ...
- Android实现RecyclerView的下拉刷新和上拉载入很多其它
需求 先上效果图, Material Design风格的下拉刷新和上拉载入很多其它. 源代码地址(欢迎star) https://github.com/studychen/SeeNewsV2 假设对于 ...
- iscroll.js 下拉刷新和上拉加载
html代码如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- IOS 开发下拉刷新和上拉加载更多
IOS 开发下拉刷新和上拉加载更多 简介 1.常用的下拉刷新的实现方式 (1)UIRefreshControl (2)EGOTTableViewrefresh (3)AH3DPullRefresh ( ...
- IOS UITableView下拉刷新和上拉加载功能的实现
在IOS开发中UITableView是非常常用的一个功能,而在使用UITableView的时候我们经常要用到下拉刷新和上拉加载的功能,今天花时间实现了简单的UITableView的下拉刷新和上拉加载功 ...
随机推荐
- 【记录】spring boot 整合mybatis 实体类返回日期格式化
1:首先将返回的实体类的时间由Date类型 换成String类型 2:将mapper.xml里的created_time 不设置类型,并将查询字段时间格式化,注意此次查询需要使用别名 不然返回查不到此 ...
- exp ORA-01455: converting column overflows integer datatype
EXP-00008: ORACLE error 1455 encounteredORA-01455: converting column overflows integer datatype add ...
- Jmeter接口压力测试(先登录再测接口)
Jmeter测试接口(包括登陆操作) 1. 创建HTTP Request先登录 参考: http://blog.csdn.net/ab_2016/article/details/782496 ...
- 一次CTS引发的网络故障
接到业务部门通知,A机房(库a)到B机房(库b)之间的数据库服务器之间的网络带宽异常突增,影响公司对外业务的整体带宽.一接到通知,作为数据库管理对所涉及的IP还是比较敏感.第一反应就是可能当时主库产生 ...
- hibernate简单连接mysql数据库配置
使用hibernate连接mysql数据库 1:项目搭建好之后,在lib包中添加必要的jar包,和mysql数据库驱动jar包: jar包可以在hibernate的下载包(hibernate3.3.2 ...
- FTP上传脚本
脚本名称:uploadToFtp.sh 脚本用途:上传文件到FTP服务器 脚本参数:$1:FTP服务器的路径,$2:本地文件 #!/bin/bash FTP_USER="testfile&q ...
- 关于respond.js
作用:可以让ie8及以下支持css3的媒体查询. 有几个问题: 1.由于浏览器的安全机制,Respond.js 不能在通过 file:// 协议(打开本地HTML文件所用的协议)访问的页面上发挥正常的 ...
- CDN技术之--全局负载均衡(GSLB)
负载均衡就是智能调度全局负载均衡(GSLB)的负载均衡主要是在多个节点之间进行均衡,其结果可能直接终结负载均衡过程,也可能将用户访问交付下一层次的(区域或本地)负载均衡系统进行处理.GSLB最通用的是 ...
- 探索Redis设计与实现4:Redis内部数据结构详解——ziplist
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 修改Tomcat的server.xml之后,tomcat 部署项目报错:Removing obsolete files from server... Could not clean server of obsolete files: null java.lang.NullPointerException
介个是你在clean tomcat的时候 文件没有clean清.(临时崩溃 系统宕机或其他原因)导致自己eclipse里的service.xml 在clean时没有copy一致. 解决方案: 1找到你 ...