Android开源项目PullToRefresh下拉刷新功能详解

先看看效果图:

Android开源项目PullToRefresh下拉刷新功能详解_第1张图片

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

下拉刷新这个功能我们都比较常见了,今天介绍的就是这个功能的实现。我将按照这个开源库的范例来一点一点介绍,今天是介绍比较常见的PullToRefreshListView,是让listView有下拉刷新功能。 

1.下载项目包,将library包导入即可,其他的包暂时不用

2.分析源码,看我们可以设置的有哪些 




 

 
 
 

 
 
 

 
 
 

 
 
 

 
 
 
  
  
  
  
  

  
  
  
  
 

 
 
 

 
 
 

 
 
 

 
 
 

 
 

 
 
 

 
 
 

 
 
 
  
  
 

 
 
 

 
 
 

 
 
 

 
 
 
 
 



看到有这么多可以设置的属性,别以为真的就可以定制了。真正要定制还得到layout中改变刷新布局 

Android开源项目PullToRefresh下拉刷新功能详解_第2张图片

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 LinkedList mListItems;
 //给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 LinkedList mListItems;
 //给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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

你可能感兴趣的:(Android开源项目PullToRefresh下拉刷新功能详解)