PullToRefresh是一套实现非常好的下拉刷新库,它支持:
ListView
ExpandableListView
GridView
WebView
ScrollView
HorizontalScrollView
ViewPager
等多种常用的需要刷新的View类型,而且使用起来也十分方便。
这里对PullToRefreshListView的使用进行讲解
代码框架
实现效果
步骤
一丶下载并导入module
将下载的zip文件进行解压 ,之后将sample导入到程序中
提示:该程序是eclipse的 导入到studio可能会出错 按照提示 下载所需文件便可解决
导入后相关的依赖库也会被倒入
二丶关联library
关联后会有一个错误 虽然不影响程序运行 但还是没有的好
解决方法
在清单文件中加上2行代码,再运行程序,错误便会消失
三丶主窗体代码
一个简单的窗体跳转(布局代码就是一个button按钮)
Intent intent =
new Intent(MainActivity.
this, PullToRefreshListActivity.
class);
startActivity(intent);
startActivity(intent);
四丶创建PullToRefreshListActivity
布局代码
<?
xml version=
"1.0"
encoding=
"utf-8"
?>
< LinearLayout xmlns: android = "http://schemas.android.com/apk/res/android"
android :layout_width= "fill_parent"
android :layout_height= "fill_parent"
android :orientation= "vertical">
<!-- 使用自定义控件 , 类在依赖库中 -->
<!--dividerHeight 决定每一条分割线的宽度 .-->
<!--smoothScrollbar 设置是否显示滚动的属性条 -->
<!--smoothScrollbar:ture 时,列表会使用更精确的基于条目在屏幕上的可见像素高度的计算方法。 默认该属性为真,
如果你的适配器需要绘制可变高的条目,他应该设为 false 。 当该属性为真时,你在适配器在显示变高条目时,滚动条的把手会在滚动的
过程中改变大小。当设为假时,列表只使用适配器中的条目数和屏幕上的 可见条目来决定滚动条的属性 -->
< com.handmark.pulltorefresh.library.PullToRefreshListView
android :id= "@+id/pull_refresh_list"
android :layout_width= "fill_parent"
android :layout_height= "fill_parent"
android :cacheColorHint= "#00000000"
android :divider= "#19000000"
android :dividerHeight= "4dp"
android :fadingEdge= "none"
android :fastScrollEnabled= "false"
android :footerDividersEnabled= "false"
android :headerDividersEnabled= "false"
android :scrollbars= "none"
android :smoothScrollbar= "false"
/>
</ LinearLayout>
< LinearLayout xmlns: android = "http://schemas.android.com/apk/res/android"
android :layout_width= "fill_parent"
android :layout_height= "fill_parent"
android :orientation= "vertical">
<!-- 使用自定义控件 , 类在依赖库中 -->
<!--dividerHeight 决定每一条分割线的宽度 .-->
<!--smoothScrollbar 设置是否显示滚动的属性条 -->
<!--smoothScrollbar:ture 时,列表会使用更精确的基于条目在屏幕上的可见像素高度的计算方法。 默认该属性为真,
如果你的适配器需要绘制可变高的条目,他应该设为 false 。 当该属性为真时,你在适配器在显示变高条目时,滚动条的把手会在滚动的
过程中改变大小。当设为假时,列表只使用适配器中的条目数和屏幕上的 可见条目来决定滚动条的属性 -->
< com.handmark.pulltorefresh.library.PullToRefreshListView
android :id= "@+id/pull_refresh_list"
android :layout_width= "fill_parent"
android :layout_height= "fill_parent"
android :cacheColorHint= "#00000000"
android :divider= "#19000000"
android :dividerHeight= "4dp"
android :fadingEdge= "none"
android :fastScrollEnabled= "false"
android :footerDividersEnabled= "false"
android :headerDividersEnabled= "false"
android :scrollbars= "none"
android :smoothScrollbar= "false"
/>
</ LinearLayout>
五丶导入声音文件
六丶PullToRefreshListActivity代码
提示:如果是复制的Activity,不要忘记在清单文件中进行注册
public final class PullToRefreshListActivity extends ListActivity {
/* //代码也没有用
static final int MENU_MANUAL_REFRESH = 0;
static final int MENU_DISABLE_SCROLL = 1;
static final int MENU_SET_MODE = 2;
static final int MENU_DEMO = 3;*/
//listView默认加载的数据
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" };
//创建一个装数据的集合,LinkedList增加删除数据效率高,查询修改慢
private LinkedList<String> mListItems;
private PullToRefreshListView mPullRefreshListView;
private ArrayAdapter<String> mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ptr_list);
//实例化控件
mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);
//设置下拉加载的监听器
mPullRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() {
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
//得到当前刷新的世界,DateUtils是安卓获取时间的工具类
String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(),
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);
//设置更新时间到ListView的刷新头,第一次刷新没有时间,第二次刷新有
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
//执行AsyncTask,往PullToRefreshListView添加新的Item
new GetDataTask().execute();
}
});
//设置上拉刷新的监听器,代码是弹个吐司
mPullRefreshListView.setOnLastItemVisibleListener(new OnLastItemVisibleListener() {
@Override
public void onLastItemVisible() {
Toast.makeText(PullToRefreshListActivity.this, "易大师好帅", Toast.LENGTH_SHORT).show();
}
});
//自定义的mPullRefreshListView实际就是个容器,其内部有一个ListView,我们得到ListView的对象,进行更多操作
ListView actualListView = mPullRefreshListView.getRefreshableView();
// 看需求,如果用不到长按Item出现对话框,就把这一段注释掉
// registerForContextMenu(actualListView);
//把ListView所需要的数据放入集合中
mListItems = new LinkedList<String>();
mListItems.addAll(Arrays.asList(mStrings));
//创建一个ListVIew系统提供的Adapter, 参数:1.上下文 2.布局资源,这里的布局资源用的就是系统提供, 3.装好数据的集合对象
mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mListItems);
//设置刷新时发出的声音
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设置适配器
actualListView.setAdapter(mAdapter);
}
private class GetDataTask extends AsyncTask<Void, Void, String[]> {
//这段代码是在子线程里运行的,一般我们做网络请求获取数据
@Override
protected String[] doInBackground(Void... params) {
//模拟网络请求,消耗掉2秒钟,单位毫秒
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
return mStrings;
}
//这段代码就是把从网络上已经获取的数据,添加PullToRefresh里去显示
@Override
protected void onPostExecute(String[] result) {
//刷新后,在第一条添加的数据
mListItems.addFirst("8班继续坚持,日后必成大器");
/* //刷新后,在最后一条添加数据
mListItems.addLast("至远教育带你装嫩!带你飞");*/
//对ListView进行重绘,也就是刷新
mAdapter.notifyDataSetChanged();
// Call onRefreshComplete when the list has been refreshed.
mPullRefreshListView.onRefreshComplete();
super.onPostExecute(result);
}
}
/*
//从第135行到201行,实现的长按ListView的Item显示出对话框的效果,如果没有这个,可以把这段代码注释掉
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, MENU_MANUAL_REFRESH, 0, "Manual Refresh");
menu.add(0, MENU_DISABLE_SCROLL, 1,
mPullRefreshListView.isScrollingWhileRefreshingEnabled() ? "Disable Scrolling while Refreshing"
: "Enable Scrolling while Refreshing");
menu.add(0, MENU_SET_MODE, 0, mPullRefreshListView.getMode() == Mode.BOTH ? "Change to MODE_PULL_DOWN"
: "Change to MODE_PULL_BOTH");
menu.add(0, MENU_DEMO, 0, "Demo");
return super.onCreateOptionsMenu(menu);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
menu.setHeaderTitle("Item: " + getListView().getItemAtPosition(info.position));
menu.add("Item 1");
menu.add("Item 2");
menu.add("Item 3");
menu.add("Item 4");
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem disableItem = menu.findItem(MENU_DISABLE_SCROLL);
disableItem
.setTitle(mPullRefreshListView.isScrollingWhileRefreshingEnabled() ? "Disable Scrolling while Refreshing"
: "Enable Scrolling while Refreshing");
MenuItem setModeItem = menu.findItem(MENU_SET_MODE);
setModeItem.setTitle(mPullRefreshListView.getMode() == Mode.BOTH ? "Change to MODE_FROM_START"
: "Change to MODE_PULL_BOTH");
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_MANUAL_REFRESH:
new GetDataTask().execute();
mPullRefreshListView.setRefreshing(false);
break;
case MENU_DISABLE_SCROLL:
mPullRefreshListView.setScrollingWhileRefreshingEnabled(!mPullRefreshListView
.isScrollingWhileRefreshingEnabled());
break;
case MENU_SET_MODE:
mPullRefreshListView.setMode(mPullRefreshListView.getMode() == Mode.BOTH ? Mode.PULL_FROM_START
: Mode.BOTH);
break;
case MENU_DEMO:
mPullRefreshListView.demo();
break;
}
return super.onOptionsItemSelected(item);
}*/
}