当前位置: 首页 > news >正文

山东大良网站建设贵阳网站建设公司

山东大良网站建设,贵阳网站建设公司,工作室 网站建设,成都广告公司地址很多android应用的下拉刷新都是使用的pulltorefresh这个开源项目,但是它的扩展性在下拉刷新同时又上拉加载更多时会有一定的局限性。查了很多地方,发现这个开源项目并不能很好的同时支持下拉刷新和上拉加载更多。这个组件有个mode的属性,可以…

很多android应用的下拉刷新都是使用的pulltorefresh这个开源项目,但是它的扩展性在下拉刷新同时又上拉加载更多时会有一定的局限性。查了很多地方,发现这个开源项目并不能很好的同时支持下拉刷新和上拉加载更多。这个组件有个mode的属性,可以设置为both,即上下同时都可拉动。但是只设置这个属性的话,上拉与下拉产生的效果是完全一致的。所以要使用这个开源项目做到下拉刷新并同时可上拉加载更多,就需要在代码中进行一些处理。

==========================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() 判断,这个返回的则是屏幕底部。
 

转载于:https://www.cnblogs.com/xgjblog/p/4228898.html

http://www.lbrq.cn/news/2432953.html

相关文章:

  • 根据网站做app网络营销图片素材
  • 微商自己做网站海外域名
  • 有哪些可以做外链的网站百度入口官网
  • 天河区门户网站教育专栏微信腾讯会议
  • 做网站的 视频国内建站平台
  • 政府网站建设构想提升神马seo关键词自然排名
  • 做竞猜网站犯法吗无锡seo公司找哪家好
  • 网站霸词怎么做关键词优化和seo
  • 有哪些做留学资讯的网站乔拓云网站注册
  • 党建网站建设技术方案搜索引擎优化工作
  • zblog 仿wordpressseo基础
  • 青海互动网站建设百度首页纯净版
  • 专业网架加工广西seo搜索引擎优化
  • 阿里云 wordpress建站推广软件的app
  • 做网站设计注意什么细节开通网站需要多少钱
  • 创建小型网站的步骤网页广告调词平台
  • 网页设计教程文字与图片广州网站设计专注乐云seo
  • 嘉兴网站制作案例百度快速优化推广
  • 网站 建设 内容 安排免费留电话的广告
  • 网优 是什么网站五年级上册语文优化设计答案
  • 焦作会计做继续教育在哪个网站建网站有哪些步骤
  • 企业网站报价方案模板下载搜索推广渠道有哪些
  • 学网站开发培训机构全网关键词搜索工具
  • 四川城乡建设委员会官方网站关键词首页排名优化
  • 淄博网站建设费用郑州seo招聘
  • 购物网站运营人力资源培训
  • 商城网站设计费用网络营销案例有哪些
  • 仿牌网站安全电商培训课程
  • 自适应网站做百度推广找客户资源的软件免费的
  • 玩具网站建设策划书最好的bt磁力搜索引擎
  • wed前端简单解析
  • DearMom以“新生儿安全系统”重塑婴儿车价值,揽获CBME双项大奖
  • React-useEffect的闭包陷阱(stale closure)
  • Pytorch01:深度学习中的专业名词及基本介绍
  • 深度学习图像分类数据集—八种贝类海鲜食物分类
  • 2025年03月20日中软(外包中控)