开源地址: https://github.com/chrisbanes/Android-PullToRefresh

简单介绍:PullToRefresh是一款支持ListView,GridView,ViewPager,ScrollView,WebView等一切能够拖动,并实现上下左右拖动刷新数据的框架,废话不多说,上代码;

[主要的android依赖项目存放在library中,支持fragment列表,ViewPager列表的存放在extras包中]

[依赖项目导入如左图]

1.支持ListView的实现:

1)XML实现

<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" > <com.handmark.pulltorefresh.library.PullToRefreshListView
android:id="@+id/my_ptr_lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="#0000"
android:divider="#0FF"
android:dividerHeight="1dp"
android:smoothScrollbar="true"
android:fastScrollEnabled="false"
android:footerDividersEnabled="false"
android:headerDividersEnabled="false" /> </RelativeLayout>

2)JAVA代码

public class PullListSampleActivity extends Activity {

	private PullToRefreshListView mPullToRefreshLv;
private ArrayAdapter<String> mAdapter;
private LinkedList<String> mListItems; private String[] mStrings = { "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
"Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",
"Allgauer Emmentaler", "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
"Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",
"Allgauer Emmentaler" }; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pull_list_sample);
//填充数据
mPullToRefreshLv=(PullToRefreshListView) findViewById(R.id.my_ptr_lv);
mListItems=new LinkedList<String>(Arrays.asList(mStrings));
mAdapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,android.R.id.text1,mListItems);
mPullToRefreshLv.setAdapter(mAdapter);
//下拉刷新的声音支持
SoundPullEventListener<ListView> soundPullEventListener=new SoundPullEventListener<ListView>(this);
soundPullEventListener.addSoundEvent(State.PULL_TO_REFRESH, R.raw.pull_event);
soundPullEventListener.addSoundEvent(State.REFRESHING, R.raw.refreshing_sound);
soundPullEventListener.addSoundEvent(State.RESET, R.raw.reset_sound);
mPullToRefreshLv.setOnPullEventListener(soundPullEventListener);
//刷新时调用的监听器
mPullToRefreshLv.setOnRefreshListener(new OnRefreshListener<ListView>() { @Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) { String label=DateUtils.formatDateTime(PullListSampleActivity.this, System.currentTimeMillis(),
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);
//设置头部Label
mPullToRefreshLv.getLoadingLayoutProxy().setLastUpdatedLabel(label);
new GetListDataTask().execute();
} }); mPullToRefreshLv.setOnLastItemVisibleListener(new OnLastItemVisibleListener() { @Override
public void onLastItemVisible() {
Toast.makeText(PullListSampleActivity.this,"all data loaded !", 800).show(); } });
} class GetListDataTask extends AsyncTask<Void, Void, String[]>{ @Override
protected String[] doInBackground(Void... params) {
//mock get datas
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return mStrings;
} @Override
protected void onPostExecute(String[] result) {
mListItems.addAll(Arrays.asList(result));
mAdapter.notifyDataSetChanged();
//手动关闭头部
mPullToRefreshLv.onRefreshComplete(); super.onPostExecute(result);
} }
}

2.支持GridView

1)XML实现

ptr:ptrMode="both"表示上下/左右都能够刷新

ptr:ptrDrawable表示刷新时显示的图标

<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" > <com.handmark.pulltorefresh.library.PullToRefreshGridView
xmlns:ptr="http://schemas.android.com/apk/res-auto"
android:id="@+id/my_ptr_gv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="#0000"
android:divider="#0FF"
android:dividerHeight="1dp"
android:smoothScrollbar="true"
android:fastScrollEnabled="false"
android:footerDividersEnabled="false"
android:headerDividersEnabled="false"
android:numColumns="auto_fit"
ptr:ptrMode="both"
ptr:ptrDrawable="@drawable/default_ptr_rotate" /> </RelativeLayout>

2)JAVA代码实现

public class PullGridSampleActivity extends Activity {

	private PullToRefreshGridView mPullToRefreshGridView;
private ArrayAdapter<String> mAdapter;
private LinkedList<String> mListItems;
private String[] mStrings = { "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
"Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",
"Allgauer Emmentaler" }; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pull_grid_sample); mPullToRefreshGridView=(PullToRefreshGridView) findViewById(R.id.my_ptr_gv);
mListItems=new LinkedList<String>();
mAdapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,
android.R.id.text1,mListItems);
mPullToRefreshGridView.setAdapter(mAdapter); //支持当没有数据的时候替代的View 详细代码依据自己的业务
TextView textView=new TextView(this);
LayoutParams params=new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
params.gravity=Gravity.CENTER;
textView.setLayoutParams(params);
textView.setText("The data is empty !");
mPullToRefreshGridView.setEmptyView(textView); SoundPullEventListener<GridView> pullEventListener=new SoundPullEventListener<GridView>(this);
pullEventListener.addSoundEvent(State.PULL_TO_REFRESH,R.raw.pull_event);
pullEventListener.addSoundEvent(State.RESET,R.raw.reset_sound);
pullEventListener.addSoundEvent(State.REFRESHING,R.raw.refreshing_sound);
mPullToRefreshGridView.setOnPullEventListener(pullEventListener); mPullToRefreshGridView.setOnRefreshListener(new OnRefreshListener2<GridView>() { @Override
public void onPullDownToRefresh(
PullToRefreshBase<GridView> refreshView) {
String label=DateUtils.formatDateTime(getApplicationContext(),
System.currentTimeMillis(),DateUtils.FORMAT_24HOUR);
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
new GetDataTask().execute();
} @Override
public void onPullUpToRefresh(
PullToRefreshBase<GridView> refreshView) {
String label=DateUtils.formatDateTime(getApplicationContext(),
System.currentTimeMillis(),DateUtils.FORMAT_24HOUR);
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
new GetDataTask().execute();
} }); } class GetDataTask extends AsyncTask<Void, Void, String[]>{ @Override
protected String[] doInBackground(Void... params) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return mStrings;
} @Override
protected void onPostExecute(String[] result) {
mListItems.addAll(Arrays.asList(result));
mAdapter.notifyDataSetChanged(); mPullToRefreshGridView.onRefreshComplete(); } } }

3.对ViewPager的实现

1)XML

<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" > <com.handmark.pulltorefresh.extras.viewpager.PullToRefreshViewPager
xmlns:ptr="http://schemas.android.com/apk/res-auto"
android:id="@+id/my_ptr_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
ptr:ptrAnimationStyle="flip"
ptr:ptrMode="both"
ptr:ptrHeaderBackground="#FFFF" /> </RelativeLayout>

2)Java实现

public class PullViewPagerSample extends Activity implements OnRefreshListener<ViewPager>{

	private PullToRefreshViewPager mPullToRefreshViewPager;

	@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pull_viewpager_sample); mPullToRefreshViewPager=(PullToRefreshViewPager) findViewById(R.id.my_ptr_viewpager); mPullToRefreshViewPager.getRefreshableView().setAdapter(new MyPagerAdapter());
mPullToRefreshViewPager.setOnRefreshListener(this); } class MyPagerAdapter extends PagerAdapter{ private final int[] sDrawables = { R.drawable.wallpaper, R.drawable.wallpaper, R.drawable.wallpaper,
R.drawable.wallpaper, R.drawable.wallpaper, R.drawable.wallpaper }; @Override
public int getCount() {
return sDrawables.length;
} @Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView imageView=new ImageView(container.getContext());
imageView.setImageResource(sDrawables[position]);
container.addView(imageView,LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
return imageView;
} @Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0==(View)arg1;
} @Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
} } @Override
public void onRefresh(PullToRefreshBase<ViewPager> refreshView) {
try {
Thread.sleep(4000);//模拟载入时间
} catch (InterruptedException e) {
e.printStackTrace();
}
mPullToRefreshViewPager.onRefreshComplete();
} }

Android开源--PullToRefresh的更多相关文章

  1. Android开源项目pulltorefresh分析与简单使用

    在Android开发中有时我们须要訪问网络实时刷新数据.比方QQ好友在线状态最新信息,QQ空间须要显示很多其它的好友动态信息,EOE论坛client显示很多其它的文章帖子信息等.android-pul ...

  2. 2015-2016最火的Android开源项目--github开源项目集锦(不看你就out了)

    标签: Android开发开源项目最火Android项目github 2015-2016最火的Android开源项目 本文整理与集结了近期github上使用最广泛最火热与最流行的开源项目,想要充电与提 ...

  3. Android开源项目分类汇总

    目前包括: Android开源项目第一篇——个性化控件(View)篇   包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView. ...

  4. 59.Android开源项目及库 (转)

    转载 : https://github.com/Tim9Liu9/TimLiu-Android?hmsr=toutiao.io&utm_medium=toutiao.io&utm_so ...

  5. Android 开源项目分类汇总(转)

    Android 开源项目分类汇总(转) ## 第一部分 个性化控件(View)主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Galler ...

  6. Android 开源项目分类汇总

    Android 开源项目分类汇总 Android 开源项目第一篇——个性化控件(View)篇  包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView ...

  7. Android开源项目及库搜集

    TimLiu-Android 自己总结的Android开源项目及库. github排名 https://github.com/trending,github搜索:https://github.com/ ...

  8. material design 的android开源代码整理

    material design 的android开源代码整理 1 android (material design 效果的代码库) 地址请点击:MaterialDesignLibrary 效果: 2 ...

  9. Android开源项目库汇总

    最近做了一个Android开源项目库汇总,里面集合了OpenDigg 上的优质的Android开源项目库,方便移动开发人员便捷的找到自己需要的项目工具等,感兴趣的可以到GitHub上给个star. 抽 ...

随机推荐

  1. 读取EXCEL的办法

    private void button9_Click(object sender, EventArgs e) { var folder =new FolderBrowserDialog(); if ( ...

  2. 修改SVN路径

    由于服务器IP更换,所以SVN的路径也就更换了. 更换SVN路径的做法是: 选中SVN checkout的文件夹,右键选择TortoiseSVN的relocate.注意要选择checkout的根目录, ...

  3. J.U.C并发框架源码阅读(三)ReentrantLock

    基于版本jdk1.7.0_80 java.util.concurrent.locks.ReentrantLock 代码如下 /* * ORACLE PROPRIETARY/CONFIDENTIAL. ...

  4. [UML] Use Case 是什么

    虽然每个人使用系统的场景有所差异,但是若用户的目标是相同的,则其场景会极为类似.那么这些类似的场景的集合就是类,这种类就称为Use Case.其实例就是场景

  5. Python的网络编程[0] -> socket[1] -> socket 模块

    socket 1. 常量 / Constants AF_* 和 SOCK_* 分别属于 AddressFamily 和 SocketType 1.1 AF_*类常量 socket.AF_UNIX:  ...

  6. Mediocre String Problem (2018南京M,回文+LCP 3×3=9种做法 %%%千年好题 感谢"Grunt"大佬的细心讲解)

    layout: post title: Mediocre String Problem (2018南京M,回文+LCP 3×3=9种做法 %%%千年好题 感谢"Grunt"大佬的细 ...

  7. Jmeter插件之PerfMon监控插件使用说明

    PerfMon是Jmeter用来监控系统资源的一款插件,可以用来监控系统的cpu.内存.I/O等性能指标. 首先是Jmeter的插件安装,需要先下载JMeter Plugins Manager这个插件 ...

  8. 洛谷——P2026 求一次函数解析式

    P2026 求一次函数解析式 题目背景 做数学寒假作业的怨念…… 题目描述 给定两个整点的坐标,求它们所在直线的函数解析式(一次函数). 输入输出格式 输入格式: 输入共两行. 第一行有两个整数x1, ...

  9. 谈谈 ES7、ES8、ES9 和 Stage 3 的那些事儿

    ES6 作为多年来 JavaScript 的重大版本变革,受到 JavaScript 开发者们的普遍欢迎. 也正是从 ES6 (ES2015) 开始,JavaScript 版本发布变为年更,即每年发布 ...

  10. Solr In Action 中文版 第一章(三)

    3.1              为什么选用Solr? 在本节中.我们希望能够提供一些关键信息来帮助于你推断Solr是否是贵公司技术方案的正确选择.我们先从Solr吸引软件架构师的方面说起. 3.1  ...