标签:
==========================pulltorefresh属性相关=====================================
开源项目: Android-PullToRefresh
项目地址: https://github.com/chrisbanes/Android-PullToRefresh/wiki/Quick-Start-Guide
1.属性: https://github.com/chrisbanes/Android-PullToRefresh/blob/master/library/res/values/attrs.xml
命名空间: xmlns:ptr=" http://schemas.android.com/apk/res-auto "
ptr:ptrAnimationStyle | 动画效果 提供了两个值 flip和rotate 默认为rotate |
ptr:ptrRefreshableViewBackground | 设置刷新View的背景颜色 |
ptr:ptrHeaderBackground | 设置头部View的背景颜色 |
ptr:ptrHeaderTextColor | 设置头部View文字的颜色 |
ptr:ptrHeaderSubTextColor | 设置头部view副标题文字的颜色 |
ptr:ptrMode |
pullFromStart: pullFromEnd: both; |
setOnRefreshListener(OnRefreshListener listener):设置刷新监听器;
setOnLastItemVisibleListener(OnLastItemVisibleListener listener):设置是否到底部监听器;
setOnPullEventListener(OnPullEventListener listener);设置事件监听器;
onRefreshComplete():设置刷新完成
========================== 监听listview滚动方向=====================================
修改为上拉加载更多的关键在于onrefresh方法执行之前判断出listview的滚动方向。以下方法是所尝试的方法中效果最好的一种,并不能说完美解决,但应该是效果最接近的一种了。(当首屏数据行数未充满屏幕,或者滚动时第一行的滚动距离小于行高,可能还是会存在一点误差。不过大部分应用的列表每页数据一般都能充满屏幕,也可在此基础结合其他手势判断对此方法进行改善)。
int mLastFirstVisibleItem = 0;
boolean mIsScrollingUp;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState)
{
if (view.getId() == mListView.getId())
{
final int currentFirstVisibleItem = mListView.getFirstVisiblePosition();
if (currentFirstVisibleItem > mLastFirstVisibleItem)
{
mIsUp = true;
}
else if (currentFirstVisibleItem < mLastFirstVisibleItem)
{
mIsUp = false;
}
mLastFirstVisibleItem = currentFirstVisibleItem;
}
}
参考资料:http://stackoverflow.com/questions/12114963/detecting-the-scrolling-direction-in-the-adapter-up-down/12115157#12115157
========================== 实现下拉刷新和上拉加载更多====================================
解析json完毕后,判断是上拉操作还是下拉刷新操作:
// 解析json
private void parseJson(String result)
{
List<ListJson> localList = parseJsonArray(Utils.parseListJson(result, "key"));
if(!mIsUp)
{
mDataList.clear();
}
mDataList.addAll(localList);
}
数据加载完毕后,notifyDataSetChanged和通知PullRefreshListView,同时页码加1:
// 加载完毕处理
private void loadComplete()
{
mPullRefreshListView.onRefreshComplete();
mAdapter.notifyDataSetChanged();
mPage += 1;
}
判断上拉和下拉方向,监听刷新listview,修改头部和底部view的文字说明:
/**
* *******************下拉刷新与上拉加载的监听处理************************
*/
// 刷新listview监听
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView)
{
// 获取刷新时间,设置刷新时间格式
String str = DateUtils.formatDateTime(getActivity(), System.currentTimeMillis(), DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_NO_NOON);
// 判断下拉还是上拉
if (!mIsUp)
mPage = 0;
// 设置刷新文本说明(刷新过程中)
if (mIsUp)
{
mPullRefreshListView.getLoadingLayoutProxy().setRefreshingLabel("正在加载");
mPullRefreshListView.getLoadingLayoutProxy().setPullLabel("上拉加载更多");
mPullRefreshListView.getLoadingLayoutProxy().setReleaseLabel("释放开始加载");
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最后加载时间:" + str);
}
else
{
mPullRefreshListView.getLoadingLayoutProxy().setRefreshingLabel("正在刷新");
mPullRefreshListView.getLoadingLayoutProxy().setPullLabel("下拉刷新");
mPullRefreshListView.getLoadingLayoutProxy().setReleaseLabel("释放开始刷新");
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最后更新时间:" + str);
}
// 启动下载任务,加载数据
loadTask();
}
int mLastFirstVisibleItem = 0;
boolean mIsScrollingUp;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState)
{
if (view.getId() == mListView.getId())
{
final int currentFirstVisibleItem = mListView.getFirstVisiblePosition();
if (currentFirstVisibleItem > mLastFirstVisibleItem)
{
mIsUp = true;
}
else if (currentFirstVisibleItem < mLastFirstVisibleItem)
{
mIsUp = false;
}
mLastFirstVisibleItem = currentFirstVisibleItem;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
// 设置刷新文本说明(展开刷新栏前)
if (mIsUp)
{
mPullRefreshListView.getLoadingLayoutProxy().setRefreshingLabel("正在加载");
mPullRefreshListView.getLoadingLayoutProxy().setPullLabel("上拉加载更多");
mPullRefreshListView.getLoadingLayoutProxy().setReleaseLabel("释放开始加载");
}
else
{
mPullRefreshListView.getLoadingLayoutProxy().setRefreshingLabel("正在刷新");
mPullRefreshListView.getLoadingLayoutProxy().setPullLabel("下拉刷新");
mPullRefreshListView.getLoadingLayoutProxy().setReleaseLabel("释放开始刷新");
}
}
@Override
public void onLastItemVisible()
{
mIsUp = true;
}
/////////////////////////////////////////////////////////////////////////////////////////
lvVideo.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
// 滚动之前,手还在屏幕上 记录滚动前的下标
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
//view.getLastVisiblePosition()得到当前屏幕可见的第一个item在整个listview中的下标
lvIndext=view.getLastVisiblePosition();
break;
//滚动停止
case OnScrollListener.SCROLL_STATE_IDLE:
//记录滚动停止后 记录当前item的位置
int scrolled=view.getLastVisiblePosition();
//滚动后下标大于滚动前 向下滚动了
if(scrolled>lvIndext){
//scroll = false;
UIHelper.ToastMessage(VideoMain.this,"菜单收起");
}
//向上滚动了
else{
UIHelper.ToastMessage(VideoMain.this,"菜单弹出");
//scroll = true;
}
break;
//////////////////////////////////////////////////////////////////////////////////////////////////////
OnScrollListener 的 onScroll() 有一个 firstVisibleItem 参数(第二个参数),向下滑动会越来越大,向上滑动就会越来越小,可以在滑动的时候存储一下这个值,然后再与当前值进行判断
另外也可以通过view.getLastVisiblePosition() 判断,这个返回的则是屏幕底部。
Android项目:使用pulltorefresh开源项目扩展为下拉刷新上拉加载更多的处理方法,监听listview滚动方向
标签:
原文地址:http://www.cnblogs.com/xgjblog/p/4228898.html