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

大学教学应用网站开发现状/讯展网站优化推广

大学教学应用网站开发现状,讯展网站优化推广,wordpress 砍价插件,建e网室内设计网免下载费ViewPager是Android应用开发中非常常用的一个控件,是一个可以让View左右翻页滑动的管理布局,需要和PagerAdapter配合使用,来创建每一页的View并显示。 ViewPager的使用其实是比较简单的,但是有一个比较重要的问题,就是ViewPager的数据刷新。…

ViewPager是Android应用开发中非常常用的一个控件,是一个可以让View左右翻页滑动的管理布局,需要和PagerAdapter配合使用,来创建每一页的View并显示。

ViewPager的使用其实是比较简单的,但是有一个比较重要的问题,就是ViewPager的数据刷新。PagerAdapter有一个notifyDataSetChanged()方法,根据Android官方文档的介绍
PagerAdapter支持数据的更改,但是数据的更改必须在主线程中进行,并且要调用notifyDataSetChanged()这个方法。我们知道所谓数据的更改,无非是页面的添加,删除和页面位置的变化。

按照官方文档的介绍,我们在改变PagerAdapter的数据源之后,然后调用一下notifyDataSetChanged()方法,应该就可以看到页面的变化,然而事情并没有那么简单,你会发现页面并没有任何的变化。那这个到底是什么情况。我们来看一下PagerAdapter的notifyDataSetChanged()这个方法都干了些什么

  public void notifyDataSetChanged() {synchronized(this) {if (this.mViewPagerObserver != null) {this.mViewPagerObserver.onChanged();}}this.mObservable.notifyChanged();}

我们可以看到这里调用了this,mViewPagerObserver.onChanged(),这里实际上是观察者模式,去通知ViewPager数据发生了改变。我们再看下ViewPager的ViewPagerObserver 的onChanged ()方法又做了什么,

 private class PagerObserver extends DataSetObserver {PagerObserver() {}public void onChanged() {ViewPager.this.dataSetChanged();}public void onInvalidated() {ViewPager.this.dataSetChanged();}}

ViewPagerObserver的onChanged()方法里调用了ViewPager的dataSetChanged()方法

 void dataSetChanged() {int adapterCount = this.mAdapter.getCount();this.mExpectedAdapterCount = adapterCount;boolean needPopulate = this.mItems.size() < this.mOffscreenPageLimit * 2 + 1 && this.mItems.size() < adapterCount;int newCurrItem = this.mCurItem;boolean isUpdating = false;int childCount;for(childCount = 0; childCount < this.mItems.size(); ++childCount) {ViewPager.ItemInfo ii = (ViewPager.ItemInfo)this.mItems.get(childCount);int newPos = this.mAdapter.getItemPosition(ii.object);if (newPos != -1) {if (newPos == -2) {this.mItems.remove(childCount);--childCount;if (!isUpdating) {this.mAdapter.startUpdate(this);isUpdating = true;}this.mAdapter.destroyItem(this, ii.position, ii.object);needPopulate = true;if (this.mCurItem == ii.position) {newCurrItem = Math.max(0, Math.min(this.mCurItem, adapterCount - 1));needPopulate = true;}} else if (ii.position != newPos) {if (ii.position == this.mCurItem) {newCurrItem = newPos;}ii.position = newPos;needPopulate = true;}}}if (isUpdating) {this.mAdapter.finishUpdate(this);}Collections.sort(this.mItems, COMPARATOR);if (needPopulate) {childCount = this.getChildCount();for(int i = 0; i < childCount; ++i) {View child = this.getChildAt(i);ViewPager.LayoutParams lp = (ViewPager.LayoutParams)child.getLayoutParams();if (!lp.isDecor) {lp.widthFactor = 0.0F;}}this.setCurrentItemInternal(newCurrItem, false, true);this.requestLayout();}}

我们可以看到dataSetChanged()方法,中

int newPos = this.mAdapter.getItemPosition(ii.object);if (newPos != -1) { .......}

newPos不等于-1才会进入刷新数据的逻辑,newPos来自于PagerAapter的getItemPosition()方法,我们再看一下PagerAdapter的getItemPosition()方法。

  public int getItemPosition(@NonNull Object object) {return -1;}

你会惊讶的发现,这特码的直接返回-1,调用PagerAdapter的notifyDataSetChanged()
ViewPager肯定不会有任何刷新啊。也是醉了。这算是Google工程师给的坑?。回到正题,那怎么办呢,我们应该需要重写PagerAdapter的getItemPosition()方法。PagerAdapter中实际上定义了两个常量。

 public static final int POSITION_UNCHANGED = -1;public static final int POSITION_NONE = -2;

默认的返回的是POSITION_UNCHANGED,我们重写getItemPosition()方法返回POSITION_NONE就可以实现数据的刷新了。

public int getItemPosition(@NonNull Object object) {return POSITION_NONE ;}

但是这样做有个严重缺点就是,所有的getItemPosition()都返回POSITION_NONE的话,
每次都要移除所有的View,再重新添加到ViewPager中,这样效率太低。

有一个比较好的优化方案是:首先在instantiateItem()方法中给每个View设置一个Tag,就是View在数据列表也就是ViewPager中的索引位置,然后在getItemPosition()判断,当前View数据列表中是否有该View,索引位置有没有发生该变,如果当前数据列表没有该View int newsPos=mViewList.indexOf(object),也即newPos为-1,返回POSITION_NONE即可;如果当前数据列表中有该View,但是索引位置发生了改变也即 int oldPosition= (int) ((View) object).getTag();
newPosition!=oldPosition ,直接返回新的索引newPosition,如果位置没有发生改变
则返回POSITION_UNCHANGED。

  @Overridepublic Object instantiateItem(@NonNull ViewGroup container, int position) {mViewList.get(position).setTag(position); //设置Tagcontainer.addView(mViewList.get(position));return mViewList.get(position);}
@Overridepublic int getItemPosition(@NonNull Object object) {int oldPosition= (int) ((View) object).getTag();int newsPos=mViewList.indexOf(object);if (newsPos>0&&newsPos!=oldPosition){((View) object).setTag(newsPos);return newsPos;}else{if (newsPos<0){return  POSITION_NONE;}else{return  POSITION_UNCHANGED;}}}

以上就是ViewPager中数据刷新的问题的分析及解决。

http://www.jmfq.cn/news/5112865.html

相关文章:

  • 苏州seo网站系统/seo网站监测
  • wordpress占用空间越来越大/seo学校培训课程
  • 文学网站建设/口碑营销策略有哪些
  • 地方性购物网站/浙江关键词优化
  • 做网站建设个体经营小微企业/搜索网站的浏览器
  • 凡科做的网站好垃圾/网址收录入口
  • 湖南专业做网站公司排名/google官网注册
  • 网站新闻 写法/谷歌网站收录提交入口
  • 网站多语言建设/网址ip地址查询工具
  • 南昌加盟网站制作/网站搜索引擎优化的基本内容
  • 网站空间数据库需要多大/他达拉非片
  • 做网站什么笔记本好用/广州各区最新动态
  • wordpress网站实现微信登录/百度官方优化指南
  • 外国网站手机dns/广告软文代理平台
  • 帮企业做网站的公司/系统优化app
  • 济南制作网站/网站建设建站在线建站
  • 建设一个门户网站需要多少钱/百度上做优化一年多少钱
  • 恒彩装饰公司口碑/河南整站百度快照优化
  • 用来做区位分析的地图网站/如何做好平台推广
  • 响应式网站内容布局/百度公司地址在哪里
  • 做市场分析的网站/国外引擎搜索
  • 如何注销公司流程及费用/seo网站推广
  • b2c网站名和网址/网站提交收录
  • 医院网站建设的计划/西安优化排名推广
  • 个人如何开发手机app/家居seo整站优化方案
  • 做网站是怎么挣钱的/营销网
  • 自己如何做黑客网站/网站首页的优化
  • 短视频素材下载网站无水印/seo百度站长工具查询
  • 网页设计教程23/淘宝seo什么意思
  • 钓鱼网站怎么制作视频/如何制作微信小程序