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. ip地址合法性

    /* * Java语法上正则化表达式的使用技巧,对于'.'要用'\\.' (2)注意空字符串“”和null的区别,判断一个字符串是不是空字符串用.equals("") * (1,判 ...

  2. 初学Spring有没有适合的书

    初学者之前没有阅读java框架源码的习惯.没有阅读过源码,知道整体流程么?知道依赖注入的概念么?知道aop么?知道其中用到了哪些设计模式么?再说了,如果一上手就是源码?难道你没有注意到Spring的类 ...

  3. 新手学JavaScript都要学什么?

    要从事网页开发,不知从何下手? 会JavaScript语言但是不知道该如何进阶! 最好的方法就是不断地做网页.写代码,不断地看别人的代码,研究别人的代码! 用代码实践JS的每个技巧点:多听多看多问多写 ...

  4. 如何垂直居中一个&lt;img&gt;?

    <!doctype html><html> <head> <meta charset="UTF-8"> <meta name= ...

  5. MVC dropdownlist使用

    View中代码 @{ ViewBag.Title = "dropdownlist"; } <h2>dropdownlist</h2> @using (Htm ...

  6. Object-C 自学笔记 - 1

    1.基本变量类型 类型 标示符 输出格式 整形 int %i 浮点 float %f 双精度 double %g 单字符 char %c 以上是基本类型,除此之外还有long, long long i ...

  7. 记一次亲身踩过的hibernate的bug

    记一次亲身踩过的hibernate的bug 在写实体类时,经常会对域增加校验,例如@NotNull表示哪个字段不能为空,昨天晚上调试代码,就遇到了问题, @Entity public class Ap ...

  8. 2017京东校招面试回忆(已成功拿到offer)

    一面 24日 晚上5:30-6:40 1 先说自己熟悉的领域 2 list的实现有什么?   arraylist1.6 1.7区别  底层   linkedlist 底层是怎么实现的 单向还是双向   ...

  9. Kafka系列之-Kafka入门

    接下来的这些博客,主要内容来自<Learning Apache Kafka Second Edition>这本书,书不厚,200多页.接下来摘录出本书中的重要知识点,偶尔参考一些网络资料, ...

  10. [转帖]创建文件或修改文件时间 touch

    Linux命令(五)创建文件或修改文件时间 touch https://www.cnblogs.com/ay-a/p/7900274.html touch -t .x86_64.rpm 记得 wind ...