先看看效果图:

adb556d667bd8f2256020e037ab69aac.png

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

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

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

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

b405998d0cfbd51d9591987d9f95615d.png

3.开始用它建立自己的工程

设置布局文件

就是插入PullToRefreshListView

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="${relativePackage}.${activityClass}"

android:background="#000000">

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"/>

开始编写代码

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);

}

}

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐