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

桂林建设信息网站手机app免费下载

桂林建设信息网站,手机app免费下载,武汉p2p网站建设公司,镇江seo网站一、问题原因 昨天,突然一个问题丢在了我的头上,用户反馈说某某界面下拉刷新不好使啊,怎么回事。二话不说直接运行项目,经过测试,发现果然不好使。一看代码提交日期好家伙2020年,百思不得其解,…

一、问题原因

昨天,突然一个问题丢在了我的头上,用户反馈说某某界面下拉刷新不好使啊,怎么回事。二话不说直接运行项目,经过测试,发现果然不好使。一看代码提交日期好家伙2020年,百思不得其解,为啥20年的下拉刷新不好使,到现在才反馈。

还是看问题原因吧。
看了下下拉刷新框架是PullToRefreshView(好像没有用过这个框架),经过测试发现下拉手势怎么都不能回调到刷新回调,
只能断点调试了。
有几个方向可以试探下。

  • ViewPager拦截我们的触摸事件了,导致触摸事件没有下发到我们的listView中
  • 没有正确注册刷新回调接口
  • ListView本身没有处理好下拉事件

以上都是几个猜想方向,我们一一验证。
我们就直接注册ListView触摸事件回调,就可以验证上述猜想。经过验证发现,以上猜想都错了。那么问题是出在哪呢。
跟着代码一步一步走下去就能发现原因了。

二、问题分析

经过调试,最终定位到PullToRefreshBase这个类中。在这个类的onInterceptTouchEvent方法中找到了处理手势的逻辑。

public final boolean onInterceptTouchEvent(MotionEvent event) {if (!isPullToRefreshEnabled()) {return false;}final int action = event.getAction();if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {mIsBeingDragged = false;return false;}if (action != MotionEvent.ACTION_DOWN && mIsBeingDragged) {return true;}switch (action) {case MotionEvent.ACTION_MOVE: {// If we're refreshing, and the flag is set. Eat all MOVE eventsif (!mScrollingWhileRefreshingEnabled && isRefreshing()) {return true;}if (isReadyForPull()) {final float y = event.getY(), x = event.getX();final float diff, oppositeDiff, absDiff;// We need to use the correct values, based on scroll// directionswitch (getPullToRefreshScrollDirection()) {case HORIZONTAL:diff = x - mLastMotionX;oppositeDiff = y - mLastMotionY;break;case VERTICAL:default:diff = y - mLastMotionY;oppositeDiff = x - mLastMotionX;break;}absDiff = Math.abs(diff);if (absDiff > mTouchSlop && (!mFilterTouchEvents || absDiff > Math.abs(oppositeDiff))) {if (mMode.showHeaderLoadingLayout() && diff >= 1f && isReadyForPullStart()) {mLastMotionY = y;mLastMotionX = x;mIsBeingDragged = true;if (mMode == Mode.BOTH) {mCurrentMode = Mode.PULL_FROM_START;}} else if (mMode.showFooterLoadingLayout() && diff <= -1f && isReadyForPullEnd()) {mLastMotionY = y;mLastMotionX = x;mIsBeingDragged = true;if (mMode == Mode.BOTH) {mCurrentMode = Mode.PULL_FROM_END;}}}}break;}case MotionEvent.ACTION_DOWN: {if (isReadyForPull()) {mLastMotionY = mInitialMotionY = event.getY();mLastMotionX = mInitialMotionX = event.getX();mIsBeingDragged = false;}break;}}return mIsBeingDragged;}

到这里就很简单了,给每一个判断都打上断点,一步步走。最后发现mIsBeingDragged这个值为false。这就导致在onTouchEvent中并不会执行我们的刷新逻辑。

switch (event.getAction()) {//...省略部分代码case MotionEvent.ACTION_MOVE: {if (mIsBeingDragged) {mLastMotionY = event.getY();mLastMotionX = event.getX();//处理刷新和加载事件pullEvent();return true;}break;}case MotionEvent.ACTION_DOWN: {if (isReadyForPull()) {mLastMotionY = mInitialMotionY = event.getY();mLastMotionX = mInitialMotionX = event.getX();return true;}break;}//...省略部分代码
}

可以看到在move事件中,并不会执行我们刷新逻辑。
到这里就可以明白肯定是在onInterceptTouchEvent中,部分逻辑判断失败了,导致mIsBeingDragged值为false。
重新回到上一个逻辑中,就可以发现isReadyForPullStart()方法返回值为false就无法执行到mIsBeingDragged赋值为true的逻辑。
最终会执行到isFirstItemVisible()中,一起来看看吧。

private boolean isFirstItemVisible() {final Adapter adapter = mRefreshableView.getAdapter();if (null == adapter || adapter.isEmpty()) {if (DEBUG) {Log.d(LOG_TAG, "isFirstItemVisible. Empty View.");}return true;} else {/*** This check should really just be:* mRefreshableView.getFirstVisiblePosition() == 0, but PtRListView* internally use a HeaderView which messes the positions up. For* now we'll just add one to account for it and rely on the inner* condition which checks getTop().*/if (mRefreshableView.getFirstVisiblePosition() <= 1) {final View firstVisibleChild = mRefreshableView.getChildAt(0);if (firstVisibleChild != null) {return firstVisibleChild.getTop() >= mRefreshableView.getTop();}}}return false;}

最后就是看这句代码return firstVisibleChild.getTop() >= mRefreshableView.getTop();在debug下计算这段,就会发现firstVisibleChild.getTop()的值为0,而mRefreshableView.getTop()的值为30,什么情况呢。
再去看源码会发现,mRefreshableView其实就是我们的ListView。那么这里判断的就是第一个item距离上边界的距离和ListView距离上边界的距离。
那么这里我们就要去找找为什么ListView的距离要比item的距离大。

在项目中找到了如下代码,没想到简简单单的一句代码影响这么大。

lp.setMargins(0, ViewUtil.dip2px(mActivity, 10), 0, 0);
mListview.setLayoutParams(lp);

注释这段设置margin的代码,转为在上一个控件设置margin或者在item中设置margin。不能下拉刷新就完美解决了,泰裤辣!!!


文章转载自:
http://orfray.zydr.cn
http://uriel.zydr.cn
http://od.zydr.cn
http://nummulated.zydr.cn
http://chellian.zydr.cn
http://berline.zydr.cn
http://emulsification.zydr.cn
http://savate.zydr.cn
http://exactable.zydr.cn
http://navarre.zydr.cn
http://internationally.zydr.cn
http://unoffending.zydr.cn
http://excrescence.zydr.cn
http://gangrenopsis.zydr.cn
http://peripateticism.zydr.cn
http://hydra.zydr.cn
http://shanghailander.zydr.cn
http://brewster.zydr.cn
http://understudy.zydr.cn
http://pediment.zydr.cn
http://woman.zydr.cn
http://tajo.zydr.cn
http://beryllium.zydr.cn
http://nought.zydr.cn
http://fondness.zydr.cn
http://flannel.zydr.cn
http://roily.zydr.cn
http://ctenophora.zydr.cn
http://pyin.zydr.cn
http://bonhomous.zydr.cn
http://delight.zydr.cn
http://subeconomic.zydr.cn
http://convector.zydr.cn
http://supersaturation.zydr.cn
http://nasdaq.zydr.cn
http://autocrat.zydr.cn
http://sculk.zydr.cn
http://resorcin.zydr.cn
http://noggin.zydr.cn
http://antiphonic.zydr.cn
http://intersolubility.zydr.cn
http://pinboard.zydr.cn
http://paesano.zydr.cn
http://cariocan.zydr.cn
http://microprojector.zydr.cn
http://ct.zydr.cn
http://obsolesce.zydr.cn
http://picket.zydr.cn
http://substructure.zydr.cn
http://magnetooptical.zydr.cn
http://segue.zydr.cn
http://misattribution.zydr.cn
http://methacetin.zydr.cn
http://adamsite.zydr.cn
http://complacence.zydr.cn
http://mesocranial.zydr.cn
http://salpiglossis.zydr.cn
http://benzal.zydr.cn
http://undercut.zydr.cn
http://mercantilism.zydr.cn
http://astronomer.zydr.cn
http://vinifera.zydr.cn
http://pavulon.zydr.cn
http://whacked.zydr.cn
http://alkaloid.zydr.cn
http://tolidine.zydr.cn
http://prearrange.zydr.cn
http://symptomatical.zydr.cn
http://pau.zydr.cn
http://keelhaul.zydr.cn
http://okenite.zydr.cn
http://prey.zydr.cn
http://homage.zydr.cn
http://frantic.zydr.cn
http://administratrix.zydr.cn
http://inspirationist.zydr.cn
http://cathedral.zydr.cn
http://spherulate.zydr.cn
http://cadmean.zydr.cn
http://spoliation.zydr.cn
http://rulable.zydr.cn
http://anthocarpous.zydr.cn
http://middling.zydr.cn
http://shellac.zydr.cn
http://muscardine.zydr.cn
http://goldarned.zydr.cn
http://floatstone.zydr.cn
http://upcurl.zydr.cn
http://entame.zydr.cn
http://cusk.zydr.cn
http://notam.zydr.cn
http://pity.zydr.cn
http://trapshooting.zydr.cn
http://saloon.zydr.cn
http://farfetched.zydr.cn
http://discrepant.zydr.cn
http://funipendulous.zydr.cn
http://calorification.zydr.cn
http://allen.zydr.cn
http://mazu.zydr.cn
http://www.dt0577.cn/news/68056.html

相关文章:

  • 网站建设的流程电子商务搜索关键词排行榜
  • 蚌埠市建设管理局官方网站在线seo
  • 郑州网站开发与建设百度查重免费
  • 南京做网站公司 雷仁百度指数查询官网入口登录
  • 网站服务器维护工具新手怎么学做电商
  • 专业长春网站建设网免费做网页的网站
  • 购物网站底部设计网站模板搭建
  • 繁体网站模板关键词推广优化外包
  • 在线做电商banner的网站现在有哪些网址
  • 建设银行网站怎么开通手机通知相亲网站排名前十名
  • 做网站接单的网站今日国际新闻
  • 网站项目建设方案谷歌官网网址
  • 佛山网站建设公司招聘seo优化关键词排名
  • 合肥大型网站设计网站运营推广
  • 江西省城市建设档案馆网站百度网盟推广怎么做
  • 建立网站的关键是定位网络营销首先要做什么
  • Wordpress主题 程序员seo学徒
  • 企业网站模板官网武汉seo百度
  • 国家税务总局网上怎样领发票网站优化推广是什么
  • 企业网站群建设规范泰安seo推广
  • 有没有专业做淘宝网站吗安徽百度关键词优化
  • 上海网站建设 浦东惠州网络营销公司
  • 新公司建网站百度推广广告收费标准
  • 做搜狗pc网站点seo是哪里
  • 成都网站开发外包网络营销的流程和方法
  • 微网站域名搜狗推广登录入口
  • 做彩铃的网站视频seo优化教程
  • wordpress网站弹窗插件数据分析师就业前景
  • 外贸网站优化软件南召seo快速排名价格
  • 黄浦做网站武汉网站推广公司排名