{"id":18001515,"url":"https://github.com/hehonghui/android_my_pull_refresh_view","last_synced_at":"2025-04-09T17:26:39.299Z","repository":{"id":20705842,"uuid":"23989657","full_name":"hehonghui/android_my_pull_refresh_view","owner":"hehonghui","description":"android下拉刷新实现原理【阐述基本原理，不建议使用】","archived":false,"fork":false,"pushed_at":"2017-03-18T10:53:24.000Z","size":1098,"stargazers_count":275,"open_issues_count":2,"forks_count":114,"subscribers_count":24,"default_branch":"master","last_synced_at":"2024-10-30T00:38:35.398Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hehonghui.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-09-13T08:33:14.000Z","updated_at":"2023-05-05T06:08:56.000Z","dependencies_parsed_at":"2022-09-10T22:52:18.423Z","dependency_job_id":null,"html_url":"https://github.com/hehonghui/android_my_pull_refresh_view","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hehonghui%2Fandroid_my_pull_refresh_view","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hehonghui%2Fandroid_my_pull_refresh_view/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hehonghui%2Fandroid_my_pull_refresh_view/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hehonghui%2Fandroid_my_pull_refresh_view/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hehonghui","download_url":"https://codeload.github.com/hehonghui/android_my_pull_refresh_view/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248076285,"owners_count":21043742,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-29T23:17:47.529Z","updated_at":"2025-04-09T17:26:39.282Z","avatar_url":"https://github.com/hehonghui.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"android_my_pull_refresh_view\n============================\n# 概述\n\u003e 这是一个通用的下拉刷新、上拉自动加载的组件，该组件继承自LinearLayout,方向为竖直布局，由三部分组成，分别是Header、ContentView、Foooter,其中ContentView的宽高都为match_parent,footer和header的宽、高分别为match_parent、wrap_content，在Header、Foooter初始时都会通过设置padding隐藏掉，只有\nContentView区域显示出来。当用户下拉到顶端，并且继续下拉时触发下拉刷新操作；当用户上拉到底部，\n\u003e  并且继续上拉时触发加载更多的操作。     \n\t更多内容请参考我的博客, \u003ca href=\"http://blog.csdn.net/bboyfeiyu/article/details/39718861\" target=\"_blank\"\u003eCSDN博客\u003c/a\u003e\n   \n   **该项目中的库都是用于阐述基本原理，不建议使用到项目中。**     \n   \n##一、布局示意图\n**原始布局**     \n![Alt text](http://img.blog.csdn.net/20140913165858954?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmJveWZlaXl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)      \n\n**设置padding后headerh和footer偏移出屏幕**      \n![Alt text](http://img.blog.csdn.net/20140913165828046?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmJveWZlaXl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)     \n\n\n## 二、已有组件的使用示例\n   下面的例子都是在一个Activity中演示。    \n### 2.1 使用PullRefreshListView\n```java\npublic class MainActivity extends Activity {\n\n    ListView mListView;\n\n    PullRefreshListView mPullRefreshListView;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        // 下拉刷新的listview\n        mPullRefreshListView = new PullRefreshListView(this);\n        // 获取listview 对象, 即PullRefreshListView中的mContentView\n        mListView = mPullRefreshListView.getContentView();\n\n        List\u003cString\u003e datas = new ArrayList\u003cString\u003e();\n        for (int i = 0; i \u003c 5; i++) {\n            datas.add(\" Item - \" + i);\n        }\n\n        // 设置adapter\n        mListView.setAdapter(new ArrayAdapter\u003cString\u003e(this, android.R.layout.simple_list_item_1,\n                datas));\n\n        // 下拉刷新\n        mPullRefreshListView.setOnRefreshListener(new OnPullRefreshListener() {\n\n            @Override\n            public void onRefresh() {\n\n                Toast.makeText(getApplicationContext(), \"refresh\", Toast.LENGTH_SHORT).show();\n                mPullRefreshListView.postDelayed(new Runnable() {\n\n                    @Override\n                    public void run() {\n                        mPullRefreshListView.refreshComplete();\n                    }\n                }, 2000);\n            }\n        });\n        // 上拉自动加载\n        mPullRefreshListView.setOnLoadMoreListener(new OnLoadMoreListener() {\n\n            @Override\n            public void onLoadMore() {\n                Toast.makeText(getApplicationContext(), \"load more\", Toast.LENGTH_SHORT).show();\n                mPullRefreshListView.postDelayed(new Runnable() {\n\n                    @Override\n                    public void run() {\n                        mPullRefreshListView.loadMoreComplete();\n                    }\n                }, 1500);\n            }\n        });\n\n\n        setContentView(mPullRefreshListView);\n\n    }\n}\n```       \n  **下拉刷新截图**   \n  \n  ![Alt text](http://img.blog.csdn.net/20140913171130673?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmJveWZlaXl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)      \n  \n  **上拉到底部的自动加载**     \n  ![Alt text](http://img.blog.csdn.net/20140913171130673?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmJveWZlaXl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)       \n\n### 2.2 使用可下拉刷新的TextView\n```java\n\npublic class MainActivity extends Activity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n // PullRefreshTextView\n        final PullRefreshTextView pullRefreshTextView = new PullRefreshTextView(this);\n        pullRefreshTextView.getContentView().setText(\"下拉刷新TextView\");\n        // 下拉刷新\n        pullRefreshTextView.setOnRefreshListener(new OnPullRefreshListener() {\n\n            @Override\n            public void onRefresh() {\n                pullRefreshTextView.getContentView().setText(new Date().toGMTString());\n                pullRefreshTextView.postDelayed(new Runnable() {\n\n                    @Override\n                    public void run() {\n                        pullRefreshTextView.refreshComplete();\n                    }\n                }, 1000);\n            }\n        });\n\n        // 上拉自动加载, TextView不能设置scroll listener ，所以无效\n        pullRefreshTextView.setOnLoadMoreListener(new OnLoadMoreListener() {\n\n            @Override\n            public void onLoadMore() {\n                Toast.makeText(getApplicationContext(), \"textview load\", Toast.LENGTH_SHORT).show();\n                pullRefreshTextView.postDelayed(new Runnable() {\n\n                    @Override\n                    public void run() {\n                        pullRefreshTextView.loadMoreComplete();\n                    }\n                }, 1000);\n            }\n        });\n\n         setContentView(pullRefreshTextView);\n\n\n    }\n}\n```    \n**截图**     \n\n![Alt text](http://img.blog.csdn.net/20140913171316628?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmJveWZlaXl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)\n        \n## 三、扩展该组件\n### 3.1、继承自PullRefreshBase\u003cT\u003e\n\tT为你要实现下拉刷新的View的类型，如ListView.       \n\t\n### 3.2、初始化ContentView\n  覆写initContentView方法，并且在该函数中初始化mContentView对象。我们以ListView为例，例如 :       \n```java\n /*\n     * 初始化mContentView\n     * @see com.uit.pullrefresh.base.PullRefreshBase#initContentView()\n     */\n    @Override\n    protected void initContentView() {\n        // 初始化mContentView\n        mContentView = new ListView(getContext());\n        // 设置OnScrollListener, 用以实现滑动到底部时的自动加载功能，如果不需要该功能可以不设置.\n        mContentView.setOnScrollListener(this);\n    }\n ```      \n     \n### 3.3、覆写判断是否滑动到顶端和底部的方法\n   我们以ListView为例，例如 :    \n```java\n    /*\n     * 是否滑动到了顶端，如果返回true, 则表示到了顶端，用户继续下拉则触发下拉刷新\n     * @see com.uit.pullrefresh.base.PullRefreshBase#isTop()\n     */\n    @Override\n    protected boolean isTop() {\n        View firstChild = mContentView.getChildAt(0);\n        if (firstChild == null) {\n            return true;\n        }\n        return mContentView.getFirstVisiblePosition() == 0\n                \u0026\u0026 (firstChild.getTop() \u003e= mContentView.getTop());\n    }\n\n    /*\n     * 下拉到listview 最后一项时则返回true, 将出发自动加载\n     * @see com.uit.pullrefresh.base.PullRefreshBase#isShowFooterView()\n     */\n    @Override\n    protected boolean isShowFooterView() {\n        if (mContentView == null || mContentView.getAdapter() == null) {\n            return false;\n        }\n\n        return mContentView.getLastVisiblePosition() == mContentView.getAdapter().getCount() - 1;\n    } \n```    \n### 3.4使用即可\n\n    \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhehonghui%2Fandroid_my_pull_refresh_view","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhehonghui%2Fandroid_my_pull_refresh_view","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhehonghui%2Fandroid_my_pull_refresh_view/lists"}