本文的下拉刷新以及上拉加载都是用PullToRefresh实现的,关于PullToRefresh的介绍以及源码,网上可以找到很多,本人在此不再赘述。
PullToRefresh是一套实现非常好的下拉刷新库,它支持:
ListView
ExpandableListView
GridView
WebView
ScrollView
HorizontalScrollView
ViewPager
等多种常用的需要刷新的View类型,而且使用起来也十分方便。
(下载地址:https://github.com/chrisbanes/Android-PullToRefresh)
PullToRefresh基本用法:
1、在布局文件中添加PullToRefresh控件,比如PullToRefreshListView;
2、在Activity中,设置监听器OnRefreshListener以响应用户下拉操作;
3、在监听器的onRefresh()方法中执行数据刷新操作,可以通过AsyncTask来实现(一般用于网络数据的操作,如果仅仅是演示,没必要通过AsyncTask实现);
4、在AsyncTask中获取到数据后,记得调用onRefreshComplete()方法通知PullToRefresh控件数据已获取完毕,可以结束刷新操作。
现在正式开始
首先:预览一下效果
效果是不是还不错,心动了么,现在就开始码农的工作把。
1.导入所需的library库文件,下载地址在上面已经给出来了。解压之后的文件目录如下,我们要用的我已经用红色圈圈标出来了
提醒:这个解压文件最好和工程目录放在同一个文件夹下,否则在导入library是会出现识别不了的情况,也就是导入的文件在查看的时候会出现红色叉叉
先把Library当工程导入到eclipse中,然后
工程目录---右键---properties---android---Library---add---选择所需---ok---apply---ok。如下图
前期工作准备完毕。
2.新建XML文件,命名为pulltorefresh
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context="${relativePackage}.${activityClass}"
android:background="#000000">
<!-- The PullToRefreshListView replaces a standard ListView widget. -->
<com.handmark.pulltorefresh.library.PullToRefreshListView
xmlns:ptr="http://schemas.android.com/apk/res-auto"
android:id="@+id/pull_refresh_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="#000000"
android:divider="#19000000"
android:dividerHeight="4dp"
android:fadingEdge="none"
android:fastScrollEnabled="false"
android:footerDividersEnabled="false"
android:headerDividersEnabled="false"
android:smoothScrollbar="true"
ptr:ptrAnimationStyle="rotate"
ptr:ptrHeaderTextColor="#ffffff"
ptr:ptrHeaderSubTextColor="#00ffff"
ptr:ptrHeaderBackground="@null"
ptr:ptrDrawable="@drawable/ic_launcher"/>
</RelativeLayout>
3.新建pulltorefresh类
代码中有几处音频引用,大家自己定义自己的把!
package com.example.android_listview; import java.util.Arrays; import java.util.LinkedList; import android.app.Activity; import android.os.Bundle; import android.text.format.DateUtils; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; import com.handmark.pulltorefresh.library.PullToRefreshBase.OnLastItemVisibleListener; import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; import com.handmark.pulltorefresh.library.PullToRefreshBase.State; import com.handmark.pulltorefresh.library.PullToRefreshListView; import com.handmark.pulltorefresh.library.extras.SoundPullEventListener; //引用pulltorefresh库文件,即library文件 public class pulltorefresh extends Activity { //一个可以下拉刷新的listView对象 private PullToRefreshListView mPullRefreshListView; //普通的listview对象 private ListView actualListView; //添加一个链表数组,来存放string数组,这样就可以动态增加string数组中的内容了 private LinkedList<String> mListItems; //给listview添加一个普通的适配器 private ArrayAdapter<String> mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pulltorefresh); initView(); //一打开应用就自动刷新,下面语句可以写到刷新按钮里面 mPullRefreshListView.setRefreshing(true); //new GetDataTask(mPullRefreshListView, mAdapter, mListItems).execute(); //mPullRefreshListView.setRefreshing(false); } private void initView() { initPTRListView(); initListView(); } /** * 设置下拉刷新的listview的动作 */ private void initPTRListView() { mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list); //设置拉动监听器 mPullRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() { @Override public void onRefresh(PullToRefreshBase<ListView> refreshView) { //设置下拉时显示的日期和时间 String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(), DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL); // 更新显示的label refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label); // 开始执行异步任务,传入适配器来进行数据改变 new GetDataTask(mPullRefreshListView, mAdapter,mListItems).execute(); } }); // 添加滑动到底部的监听器 mPullRefreshListView.setOnLastItemVisibleListener(new OnLastItemVisibleListener() { @Override public void onLastItemVisible() { Toast.makeText(getApplication(), "已经到底了", Toast.LENGTH_SHORT).show(); } }); //mPullRefreshListView.isScrollingWhileRefreshingEnabled();//看刷新时是否允许滑动 //在刷新时允许继续滑动 mPullRefreshListView.setScrollingWhileRefreshingEnabled(true); //mPullRefreshListView.getMode();//得到模式 //上下都可以刷新的模式。这里有两个选择:Mode.PULL_FROM_START,Mode.BOTH,PULL_FROM_END mPullRefreshListView.setMode(Mode.BOTH); /** * 设置反馈音效 */ SoundPullEventListener<ListView> soundListener = new SoundPullEventListener<ListView>(this); soundListener.addSoundEvent(State.PULL_TO_REFRESH, R.raw.pull_event); soundListener.addSoundEvent(State.RESET, R.raw.reset_sound); soundListener.addSoundEvent(State.REFRESHING, R.raw.refreshing_sound); mPullRefreshListView.setOnPullEventListener(soundListener); } /** * 设置listview的适配器 */ private void initListView() { //通过getRefreshableView()来得到一个listview对象 actualListView = mPullRefreshListView.getRefreshableView(); String[] data = new String[] { "乖,摸摸头", "我有一碗酒,可以慰风尘", "对不起", "普通朋友", "不许哭", "唱歌人不许掉眼泪", "听歌人不许掉眼泪", "一个叫木头,一个叫马尾","椰子姑娘流浪记","风马少年","小因果","我的师弟不是人" }; mListItems = new LinkedList<String>(); //把string数组中的string添加到链表中 mListItems.addAll(Arrays.asList(data)); mAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, mListItems); actualListView.setAdapter(mAdapter); } }
4.这里用到了一个异步任务,来模仿从网络加载数据(异步类AsyncTask)
这里要注意的是,加载完后要出发刷新完成和通知适配器改变的方法
新建GetDataTask继承AsyncTask
package com.example.android_listview; import java.util.LinkedList; import com.handmark.pulltorefresh.library.PullToRefreshListView; import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; import android.os.AsyncTask; import android.widget.ArrayAdapter; public class GetDataTask extends AsyncTask<Void, Void, Void>{ private PullToRefreshListView mPullRefreshListView; private ArrayAdapter<String> mAdapter; private LinkedList<String> mListItems; public GetDataTask(PullToRefreshListView listView, ArrayAdapter<String> adapter,LinkedList<String> listItems) { // TODO 自动生成的构造函数存根 mPullRefreshListView = listView; mAdapter = adapter; mListItems = listItems; } @Override protected Void doInBackground(Void... params) { //模拟请求 try { Thread.sleep(2000); } catch (InterruptedException e) { } return null; } @Override protected void onPostExecute(Void result) { // TODO 自动生成的方法存根 super.onPostExecute(result); //得到当前的模式 Mode mode = mPullRefreshListView.getCurrentMode(); if(mode == Mode.PULL_FROM_START) { mListItems.addFirst("这是刷新出来的数据"); } else { mListItems.addLast("这是加载出来的数据"); } // 通知数据改变了 mAdapter.notifyDataSetChanged(); // 加载完成后停止刷新 mPullRefreshListView.onRefreshComplete(); } }
整个工程就完成了,主要代码来源:http://www.cnblogs.com/tianzhijiexian/p/4023802.html
当然大家也可以自己写自己特色ListView的下拉刷新,可以参考http://blog.csdn.net/loongggdroid/article/details/9385535
这篇博客讲解很清楚:http://blog.csdn.net/leehong2005/article/details/12567757
2016.5.15找到了一个感觉万能的下拉刷新,在此标记一下:http://www.jb51.net/article/39714.htm,
http://www.2cto.com/kf/201408/329317.html源码下载地址:https://github.com/jingchenUSTC/PullToRefreshAndLoad