先看看效果图:
开源项地址:https://github.com/chrisbanes/Android-PullToRefresh
下拉刷新这个功能我们都比较常见了,今天介绍的就是这个功能的实现。我将按照这个开源库的范例来一点一点介绍,今天是介绍比较常见的PullToRefreshListView,是让listView有下拉刷新功能。
1.下载项目包,将library包导入即可,其他的包暂时不用
2.分析源码,看我们可以设置的有哪些
看到有这么多可以设置的属性,别以为真的就可以定制了。真正要定制还得到layout中改变刷新布局
3.开始用它建立自己的工程
设置布局文件
就是插入PullToRefreshListView
开始编写代码
1.找到这个控件,并且设置监听器
这里面用到了一个日期的工具类,其实就是设置上次下拉的时间的。此外在下拉后会触发一个异步任务
/** * 设置下拉刷新的listview的动作 */ private void initPTRListView() { mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list); //设置拉动监听器 mPullRefreshListView.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh(PullToRefreshBase 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 soundListener = new SoundPullEventListener (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); }
2.从上面的那个控件中,得到它包含的listView,并且设置适配器
//普通的listview对象 private ListView actualListView; //添加一个链表数组,来存放string数组,这样就可以动态增加string数组中的内容了 private LinkedListmListItems; //给listview添加一个普通的适配器 private ArrayAdapter mAdapter;
这里用到了一个LinkedList的对象,这个是一个类似于ArrayList的链表数组,比较方便在开头和末尾添加String
/** * 设置listview的适配器 */ private void initListView() { //通过getRefreshableView()来得到一个listview对象 actualListView = mPullRefreshListView.getRefreshableView(); String []data = new String[] {"android","ios","wp","java","c++","c#"}; mListItems = new LinkedList(); //把string数组中的string添加到链表中 mListItems.addAll(Arrays.asList(data)); mAdapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, mListItems); actualListView.setAdapter(mAdapter); }
3.写一个异步任务,来模仿从网络加载数据
这里要注意的是,加载完后要出发刷新完成和通知适配器改变的方法
package com.kale.ptrlistviewtest; import java.util.LinkedList; import android.os.AsyncTask; import android.widget.ArrayAdapter; import com.handmark.pulltorefresh.library.PullToRefreshListView; import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; /** * @author:Jack Tony * @tips :通过异步任务来加载网络中的数据,进行更新 * @date :2014-10-14 */ public class GetDataTask extends AsyncTask{ private PullToRefreshListView mPullRefreshListView; private ArrayAdapter mAdapter; private LinkedList mListItems; public GetDataTask(PullToRefreshListView listView, ArrayAdapter adapter,LinkedList 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(); } }
贴上acitivty中的全部代码
MainActivity.java
package com.kale.ptrlistviewtest; 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; public class MainActivity extends Activity { //一个可以下拉刷新的listView对象 private PullToRefreshListView mPullRefreshListView; //普通的listview对象 private ListView actualListView; //添加一个链表数组,来存放string数组,这样就可以动态增加string数组中的内容了 private LinkedListmListItems; //给listview添加一个普通的适配器 private ArrayAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 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 () { @Override public void onRefresh(PullToRefreshBase 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 soundListener = new SoundPullEventListener (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[] {"android","ios","wp","java","c++","c#"}; mListItems = new LinkedList (); //把string数组中的string添加到链表中 mListItems.addAll(Arrays.asList(data)); mAdapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, mListItems); actualListView.setAdapter(mAdapter); } }
源码下载:http://xiazai.jb51.net/201609/yuanma/AndroidListView(jb51.net).rar
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。