ListView的下拉刷新很常见,很多开源的框架都能做到这个效果,当然也可以自己去实现。本篇案例是基于xlistview的。

布局:

<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" >  

    <me.maxwin.view.XListView
        android:id="@+id/xlv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />  

</RelativeLayout> 

主活动的代码:

    package com.itydl.xlistviewdemo;  

    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;  

    import me.maxwin.view.XListView;
    import me.maxwin.view.XListView.IXListViewListener;
    import android.app.Activity;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.os.SystemClock;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;  

    public class MainActivity extends Activity {  

        private XListView mXListView;
        List<String> datas = new ArrayList<String>();
        private MyAdapter adapter;
        private boolean isLoadMore;//是否正在加载更多数据的标记  

        private long preTime;//上一次刷新的当前系统时间毫秒值
        private Handler handler = new Handler(){
            public void handleMessage(android.os.Message msg) {
                if(isLoadMore){
                    //消息是上拉加载更多
                    initDatas();
                    isLoadMore = false;
                    //刷新完毕,关闭上拉加载效果
                    mXListView.stopLoadMore();
                }else{
                    //消息是下拉刷新
                    datas.clear();
                    initDatas();
                    //刷新完毕,关闭下拉刷新效果
                    mXListView.stopRefresh();
                }
                // 刷新listview
                adapter.notifyDataSetChanged();
            };
        };  

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initDatas();
            mXListView = (XListView) findViewById(R.id.xlv);
            //设置适配器到ListView
            adapter = new MyAdapter();
            mXListView.setAdapter(adapter);
            initListener();
        }  

        private void initListener() {
            //设置可以下拉刷新,默认就是true
            mXListView.setPullRefreshEnable(true);  

            //设置可以上拉加载,默认是false
            mXListView.setPullLoadEnable(true);  

            mXListView.setXListViewListener(new IXListViewListener() {  

                @Override
                public void onRefresh() {
                    // 下拉刷新,实际发送Handler
                    //发送一个空消息,延迟两秒后告知刷新数据
                    handler.sendMessageDelayed(Message.obtain(), 2000);
                    //添加上一次刷新的时间:
                    if(preTime != 0){
                        mXListView.setRefreshTime(refreshData(preTime));
                    }
                    preTime = System.currentTimeMillis();
                }  

                private String refreshData(long preTime) {
                    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(preTime));
                }  

                @Override
                public void onLoadMore() {
                    //标记正在加载更多,发送Handler
                    isLoadMore = true;
                    handler.sendMessageDelayed(Message.obtain(), 2000);
                }
            });
        }  

        /**模拟网络数据*/
        private void initDatas() {
            //实际开发应该子线程执行
            for (int i = 0; i < 50; i++) {
                datas.add("我是第" + i + "条数据");
            }
        }  

        private class MyAdapter extends BaseAdapter{  

            @Override
            public int getCount() {
                if(datas != null){
                    return datas.size();
                }
                return 0;
            }  

            @Override
            public Object getItem(int position) {
                if(datas != null){
                    return datas.get(position);
                }
                return null;
            }  

            @Override
            public long getItemId(int position) {
                return position;
            }  

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                //模拟item为TextView
                TextView textView = new TextView(MainActivity.this);
                textView.setText(getItem(position)+"");
                textView.setTextColor(Color.GREEN);
                return textView;
            }
        }
    }  

短短几行代码已经完成了主要功能,运行如下:

喜欢的朋友可以关注我哦,本专栏会不定期更新简单有趣的Android小文~

Android简易实战教程--第四十三话《上拉加载与下拉刷新》的更多相关文章

  1. Android简易实战教程--第四十七话《使用OKhttp回调方式获取网络信息》

    在之前的小案例中写过一篇使用HttpUrlConnection获取网络数据的例子.在OKhttp盛行的时代,当然要学会怎么使用它,本篇就对其基本使用做一个介绍,然后再使用它的接口回调的方式获取相同的数 ...

  2. Android简易实战教程--第四十话《Spinner》

    对于Spinner控件的介绍和使用方法,可以先看之前写过的一篇博客:Spinner控件详解 本篇就基于这个知识点完成一个简单的小案例: 根据介绍,先写一个布局: <?xml version=&q ...

  3. Android简易实战教程--第三十三话《 AsyncTask异步倒计时》

    本篇小案例,完成一个倒计时.方式选择AsyncTask.代码贴在下面: 布局文件soeasy: <LinearLayout xmlns:android="http://schemas. ...

  4. Android简易实战教程--第五十话《动画扫描》

    祝新年快乐!2017(一起)前行. 转载博客请注明出处:道龙的博客 本篇简答的小案例,使用动画知识,完成一个类似雷达扫描效果,并且加入自定义进度条.对于自定义进度条前面有很详细的解析和案例了,本篇就结 ...

  5. vue.js移动端app实战4:上拉加载以及下拉刷新

    上拉加载以及下拉刷新都是移动端很常见的功能,在搜索或者一些分类列表页面常常会用到. 跟横向滚动一样,我们还是采用better-scroll这个库来实现.由于better已经更新了新的版本,之前是0.几 ...

  6. Android简易实战教程--第十六话《SharedPreferences保存用户名和密码》

    之前在Android简易实战教程--第七话<在内存中存储用户名和密码> 那里是把用户名和密码保存到了内存中,这一篇把用户名和密码保存至SharedPreferences文件.为了引起误导, ...

  7. android使用PullToRefresh实现上拉加载和下拉刷新效果

    其实很早前就在博客园中也写过官方的下拉刷新控件SwipeRefreshLayout,但是这个控件仅仅支持下拉刷新,用起来还算可以.然而在我们实际开发应用中,很多地方都不止有下拉刷新,而且还有上拉加载的 ...

  8. android ListView上拉加载更多 下拉刷新功能实现(采用pull-to-refresh)

    Android实现上拉加载更多功能以及下拉刷新功能, 采用了目前比较火的PullToRefresh,他是目前实现比较好的下拉刷新的类库. 目前他支持的控件有:ListView, ExpandableL ...

  9. Android简易实战教程--第四十八话《Android - Timer、TimerTask和Handler实现倒计时》

    之前本专栏文章中的小案例有写到:第三十九话<Chronometer实现倒计时> 以及使用异步实现倒计时:第三十三话< AsyncTask异步倒计时> 本篇文章 结合Timer. ...

随机推荐

  1. &lt;&lt;有效软件测试&gt;&gt; 读书笔记和自己的一些思考

    需求阶段 1. 测试人员及早介入,需要彻底了解产品,设计测试过程 * 及早介入,可以了解在开发的过程中需要使用哪些新技术,新的平台, 测试组是否方便进行测试,是否方便进行自动化测试,早期开发和测试应该 ...

  2. firemonkey中stringgrid属性大全

    StringGrid之属性大全: Align:                            //确定组件在父类组件区内的对齐方式(alScale:随窗口 放大缩小) AlterRowBack ...

  3. eclipse导入包的快捷键

    在Eclipse里,写一个没有导入相应包的类名(这个类名已经完全写全,比如LayoutManager), 可以用ctrl+shift+M/Ctrl+Shift+o/Ctrl+1导入相应的包. 其中Ct ...

  4. NPOI.dll 用法。单元格,样式,字体,颜色,行高,宽度。读写excel

    NPOI.dll 用法.单元格,样式,字体,颜色,行高,宽度.读写excel 转载:http://yuncode.net/code/c_531e679b3896495 view source prin ...

  5. mysql存储过程详细讲解及完整实例下载

    一.存储过程概念 1.存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集.经编译后存储在数据库 中. 2.存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给 ...

  6. 进程篇:wait & waitpid

    #include <sys/types.h> /* 提供类型pid_t的定义 */ #include <sys/wait.h> pid_t wait(int *status) ...

  7. WPF Button 样式

    WPF CheckBox 自定义样式 给Button设置ToolTip <Style TargetType="{x:Type Button}" x:Key="Def ...

  8. day04流程控制之while循环

    流程控制之while循环 1.什么是while循环 循环指的是一个重复做某件事的过程 2.为何有循环 为了让计算机能像人一样重复 做某件事 3.如何用循环 ''' # while循环的语法:while ...

  9. UVa 11825 - Hackers&#39; Crackdown DP, 枚举子集substa = (substa - 1)&amp;sta 难度: 2

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  10. [InfluxDB] 安装与配置

    [InfluxDB] 安装与配置 1- 下载 ubtuntu: wget https://dl.influxdata.com/influxdb/releases/influxdb_1.5.2_amd6 ...