• Stars
    star
    275
  • Rank 149,796 (Top 3 %)
  • Language
    Java
  • Created about 10 years ago
  • Updated over 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

android下拉刷新实现原理【阐述基本原理,不建议使用】

android_my_pull_refresh_view

概述

这是一个通用的下拉刷新、上拉自动加载的组件,该组件继承自LinearLayout,方向为竖直布局,由三部分组成,分别是Header、ContentView、Foooter,其中ContentView的宽高都为match_parent,footer和header的宽、高分别为match_parent、wrap_content,在Header、Foooter初始时都会通过设置padding隐藏掉,只有 ContentView区域显示出来。当用户下拉到顶端,并且继续下拉时触发下拉刷新操作;当用户上拉到底部, 并且继续上拉时触发加载更多的操作。
更多内容请参考我的博客, CSDN博客

该项目中的库都是用于阐述基本原理,不建议使用到项目中。

##一、布局示意图 原始布局
Alt text

设置padding后headerh和footer偏移出屏幕
Alt text

二、已有组件的使用示例

下面的例子都是在一个Activity中演示。

2.1 使用PullRefreshListView

public class MainActivity extends Activity {

    ListView mListView;

    PullRefreshListView mPullRefreshListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 下拉刷新的listview
        mPullRefreshListView = new PullRefreshListView(this);
        // 获取listview 对象, 即PullRefreshListView中的mContentView
        mListView = mPullRefreshListView.getContentView();

        List<String> datas = new ArrayList<String>();
        for (int i = 0; i < 5; i++) {
            datas.add(" Item - " + i);
        }

        // 设置adapter
        mListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
                datas));

        // 下拉刷新
        mPullRefreshListView.setOnRefreshListener(new OnPullRefreshListener() {

            @Override
            public void onRefresh() {

                Toast.makeText(getApplicationContext(), "refresh", Toast.LENGTH_SHORT).show();
                mPullRefreshListView.postDelayed(new Runnable() {

                    @Override
                    public void run() {
                        mPullRefreshListView.refreshComplete();
                    }
                }, 2000);
            }
        });
        // 上拉自动加载
        mPullRefreshListView.setOnLoadMoreListener(new OnLoadMoreListener() {

            @Override
            public void onLoadMore() {
                Toast.makeText(getApplicationContext(), "load more", Toast.LENGTH_SHORT).show();
                mPullRefreshListView.postDelayed(new Runnable() {

                    @Override
                    public void run() {
                        mPullRefreshListView.loadMoreComplete();
                    }
                }, 1500);
            }
        });


        setContentView(mPullRefreshListView);

    }
}

下拉刷新截图

Alt text

上拉到底部的自动加载
Alt text

2.2 使用可下拉刷新的TextView

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

 // PullRefreshTextView
        final PullRefreshTextView pullRefreshTextView = new PullRefreshTextView(this);
        pullRefreshTextView.getContentView().setText("下拉刷新TextView");
        // 下拉刷新
        pullRefreshTextView.setOnRefreshListener(new OnPullRefreshListener() {

            @Override
            public void onRefresh() {
                pullRefreshTextView.getContentView().setText(new Date().toGMTString());
                pullRefreshTextView.postDelayed(new Runnable() {

                    @Override
                    public void run() {
                        pullRefreshTextView.refreshComplete();
                    }
                }, 1000);
            }
        });

        // 上拉自动加载, TextView不能设置scroll listener ,所以无效
        pullRefreshTextView.setOnLoadMoreListener(new OnLoadMoreListener() {

            @Override
            public void onLoadMore() {
                Toast.makeText(getApplicationContext(), "textview load", Toast.LENGTH_SHORT).show();
                pullRefreshTextView.postDelayed(new Runnable() {

                    @Override
                    public void run() {
                        pullRefreshTextView.loadMoreComplete();
                    }
                }, 1000);
            }
        });

         setContentView(pullRefreshTextView);


    }
}

截图

Alt text

三、扩展该组件

3.1、继承自PullRefreshBase

T为你要实现下拉刷新的View的类型,如ListView.       

3.2、初始化ContentView

覆写initContentView方法,并且在该函数中初始化mContentView对象。我们以ListView为例,例如 :

 /*
     * 初始化mContentView
     * @see com.uit.pullrefresh.base.PullRefreshBase#initContentView()
     */
    @Override
    protected void initContentView() {
        // 初始化mContentView
        mContentView = new ListView(getContext());
        // 设置OnScrollListener, 用以实现滑动到底部时的自动加载功能,如果不需要该功能可以不设置.
        mContentView.setOnScrollListener(this);
    }

3.3、覆写判断是否滑动到顶端和底部的方法

我们以ListView为例,例如 :

    /*
     * 是否滑动到了顶端,如果返回true, 则表示到了顶端,用户继续下拉则触发下拉刷新
     * @see com.uit.pullrefresh.base.PullRefreshBase#isTop()
     */
    @Override
    protected boolean isTop() {
        View firstChild = mContentView.getChildAt(0);
        if (firstChild == null) {
            return true;
        }
        return mContentView.getFirstVisiblePosition() == 0
                && (firstChild.getTop() >= mContentView.getTop());
    }

    /*
     * 下拉到listview 最后一项时则返回true, 将出发自动加载
     * @see com.uit.pullrefresh.base.PullRefreshBase#isShowFooterView()
     */
    @Override
    protected boolean isShowFooterView() {
        if (mContentView == null || mContentView.getAdapter() == null) {
            return false;
        }

        return mContentView.getLastVisiblePosition() == mContentView.getAdapter().getCount() - 1;
    } 

3.4使用即可

More Repositories

1

awesome-english-ebooks

经济学人(含音频)、纽约客、卫报、连线、大西洋月刊等英语杂志免费下载,支持epub、mobi、pdf格式, 每周更新
CSS
20,476
star
2

android-tech-frontier

【停止维护】一个定期翻译国外Android优质的技术、开源库、软件架构设计、测试等文章的开源项目
10,443
star
3

the-economist-ebooks

经济学人(含音频)、纽约客、自然、新科学人、卫报、科学美国人、连线、大西洋月刊、国家地理等英语杂志免费下载、订阅(kindle推送),支持epub、mobi、pdf格式, 每周更新. The Economist 、The New Yorker 、Nature、The Atlantic 、New Scientist、The Guardian、Scientific American、Wired magazines, free download and subscription for kindle, mobi、epub、pdf format.
CSS
8,890
star
4

AndroidEventBus

A lightweight eventbus library for android, simplifies communication between Activities, Fragments, Threads, Services, etc.
Java
1,611
star
5

Colorful

基于Theme的Android动态换肤库,无需重启Activity、无需自定义View,方便的实现日间、夜间模式。
Java
1,398
star
6

iOS-tech-frontier

一个定期翻译国外iOS优质的技术、开源库、软件架构设计、测试等文章的开源项目
1,202
star
7

mockito-doc-zh

Mockito框架中文文档
1,113
star
8

mmat

An automatically testing and analysis hprof library for android app (自动分析Android内存泄漏)
Java
178
star
9

simple_net_framework

SimpleNet网络框架,仅供学习参考,不推荐使用,不进行维护。
Java
139
star
10

android_dp_analysis_code

《Android 源码设计模式解析与实战》示例代码
Java
130
star
11

the-tech-frontier-app

The Android App for Tech Frontier
Java
121
star
12

simple_imageloader

A Simple ImageLoader for Android 【不建议使用到项目中,仅作示例】
Java
120
star
13

commonadapter

通用的ListView、RecyclerView的Adapter
Java
107
star
14

app-test-arch

Android 单元测试、Monkey、LeakCanary测试demo项目【粗略示例】
Java
98
star
15

android_jtm_sourcecode

Java
85
star
16

SimpleTvIME

简单的Android Tv远程遥控器 & 输入法 【不进行维护】
Java
79
star
17

dp-issues

Android源码设计模式解析与实战勘误
70
star
18

Chris-Android-PullToRefresh

在Chris Banes的Android-PullToRefresh的基础上增加了RecyclerView的支持与Demo
Java
56
star
19

ripplelayout

RippleLayout library
Java
50
star
20

the-hot-tech-blogs

每周六会从掘金抓取7天内最热门Android、iOS、后端、前端各20篇技术文章, 然后制作成 mobi、epub 格式的电子书推送给订阅者, 支持推送到kindle 设备、kindle手机app、普通邮箱.
42
star
21

SegmentView

This is a Android Segment Control ( View ) like iOS, support 2.3 and above.
Java
39
star
22

materiallayout

materiallayout library and demo.
Java
34
star
23

listview_nested_gridview

ListView嵌套GridView的消息流页面,解决了GridView高度和宽度问题
Java
32
star
24

jtm-techfrontier-app

Java
31
star
25

CrashCanary

Crash Log Viewer
Java
30
star
26

leakcanary-for-eclipse

用于eclipse的leakcanary
Java
30
star
27

AndroidShakeLib

Android 摇一摇手机功能
Java
23
star
28

android-jtm-issues

《Android开发进阶-从小工到专家》勘误
23
star
29

InjectDagger

Java
22
star
30

ErasableTextView

仿支付宝刮奖效果,自定义view
Java
20
star
31

umeng-social-custom-shareui

custom ui
Java
19
star
32

AndroidMvpBase

Android MVP Base Library
Java
18
star
33

simpledb

A Lightweight android database library
Java
12
star
34

AndroidImageBrowser

Android Image Browser
Java
12
star
35

tech-frontier-mvp

8
star
36

common_adapter_viewholder

common_adapter_viewholder
Java
7
star
37

FastScrollLayout

Android fast scroll layout from ListView
Java
6
star
38

te_audios

The Economist audio
5
star
39

Java-23-Design-Patterns

23 design patterns
Java
5
star
40

MockServer

mock server with Go
Go
4
star
41

mdict-analysis

Python
4
star
42

SimpleTask

A Simple Task Library to use AsyncTask easier.
Java
4
star
43

en_dict

3
star
44

bboyfeiyu.github.io

Blog repository
HTML
3
star
45

hehonghui.github.io

HTML
3
star
46

images_gridview_gallery

扫描本地图片,多图选择,异步加载,图片错位示例
Java
3
star
47

LoveWeRead

Java
3
star
48

zapr-sdk-sample-app

Java
2
star
49

SimpleNote

Java
2
star
50

fribidi

C
1
star
51

MusicPlayer2

MusicPlayer
C++
1
star
52

VolleyModule

使用Volley时封装的简单工具类
Java
1
star
53

GradleDemo

Java
1
star
54

dev-tech-frontier

开发技术前线
1
star
55

AndroidEventBus_maven

1
star