开源地址: 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. centos6.6部署mysql mmm高可用架构

    一.环境简述 1.工作逻辑图 2.MySQL-MMM优缺点 优点:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证的数据的一致性. 缺点:Monitor节点是 ...

  2. hdu 5082(水题)

    Love Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. es6记录

    3.5? 一.const 1.冻结对象 const foo = Object.freeze({}); // 常规模式时,下面一行不起作用: // 严格模式时,该行会报错 foo.prop = ; 2. ...

  4. 异步 JavaScript 之理解 macrotask 和 microtask(转)

    这个知识点... https://blog.keifergu.me/2017/03/23/difference-between-javascript-macrotask-and-microtask/? ...

  5. Reporting Services 的一些问题

    做报表有一段时间,感觉Reporting Services还是比较麻烦的,因为网上的例子有的比较少,很多地方都需要自己摸索,说说我遇到的一些问题 1:页首的设计 一些固定显示的资料放在页首里面比较方便 ...

  6. 关于引用iframe的一点小说明

    有时候,在web页面中使用iframe,可以解决一些实际问题,比如跨域访问等……这篇文章的关键不是iframe适用于哪些场景?而是iframe间如何进行互通?所谓互通是指: 情况1:在任何一个页面中调 ...

  7. Python的工具包[0] -> numpy科学计算 -> numpy 库及使用总结

    NumPy 目录 关于 numpy numpy 库 numpy 基本操作 numpy 复制操作 numpy 计算 numpy 常用函数 1 关于numpy / About numpy NumPy系统是 ...

  8. Python的扩展接口[2] -> 动态链接库DLL[0] -> 动态链接库及辅助工具

    动态链接库 / Dynamic Link Library 目录 动态链接库简介 函数封装DLL 组件对象模型COM 如何判断.dll文件是COM还是DLL 辅助工具 1 动态链接库简介 / DLL I ...

  9. Logger Rate Limiter -- LeetCode

    Design a logger system that receive stream of messages along with its timestamps, each message shoul ...

  10. 【hdu3652】数位dp(浅尝ACM-A)

    向大佬学习 第一次写博客有点紧张,也算是小萌新的突破吧 这次主要是总结一下校内的ACM比赛的各种题,主要是新思路以及学到的新知识 先放一张 下面开始说正事 题面 A wqb-number, or B- ...