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

郑州高端网站建设团队搜索引擎推广实训

郑州高端网站建设团队,搜索引擎推广实训,安装网站模板,大庆绿色出行app1 RecyclerView简介 RecyclerView是一款非常强大的widget#xff0c;它可以帮助您灵活地显示列表数据。当我开始学习 RecyclerView的时候#xff0c;我发现对于复杂的列表界面有很多资源可以参考#xff0c;但是对于简单的列表展现就鲜有可参考的资源了。虽然RecyclerView的…1 RecyclerView简介 RecyclerView是一款非常强大的widget它可以帮助您灵活地显示列表数据。当我开始学习 RecyclerView的时候我发现对于复杂的列表界面有很多资源可以参考但是对于简单的列表展现就鲜有可参考的资源了。虽然RecyclerView的组成结构乍一看有些复杂但是深入理解以后您会发现它其实非常简单明了。 RecyclerView一般作为Android显示列表的控件有诸多优异的性能。回收池策略能加载上亿级数据并不发生卡顿适配器模式能展示任意显示需求。 RecyclerView就像传送带充分利用传送带原理永远只有用户看到的数据才会加载到内存而看不到的在等待被加载。传送带能够源源不断的传送亿级货物RecyclerView也能够显示加载亿级Item。 1.3 RecyclerView架构中核心组件 回收池能回收任意Item控件并返回符合类型的Item控件 比如 onBinderViewHodler方法中的第一个参数是从回收池中返回的适配器Adapter接口经常辅助RecyclerView实现列表展示适配器模式将用户界面展示与交互分离RecyclerView是做触摸事件的交互主要实现边界值判断根据用户的触摸反馈协调回收池对象与适配器对象之间的工作 我们带着这几个问题来学习RecyclerView Listview和Recycerview的缓存差别RecyclerView滑出去的View到哪里去了RecyclerView如何复用回收池的ViewRecyclerView的四级缓存机制 1.4 RecyclerView滑动相关 众所周知RecyclerView在android中实现列表是性能非常好的那么性能好的原因在哪里呢关键还是在它在处理view时的回收和复用。列表在滑动的时候会进行itemView的回收和复用那么我们就从滑动回调即onTouchEvent来入手分析 1.4.1 基本概念 ViewHolder: View的容器一项View就对应一个ViewHolderRecylerRecyclerView的内部类主要负责View的回收和复用LinearLayoutManager: RecyclerView的线性布局管理器 1.4.2 滑动时函数调用链 这里我们大概了解下滑动时的函数调用链帮助理解后面分析四级缓存相关的思路。 1.4.3 onMeasrue初始化 RecyclerView的宽度和高度开发者们都喜欢设置层wrap_content或者match_parent。所以需要通过实际内容确定RecyclerView高度 情况1 : 当item数不足的时候比如RecyclerView只加载了2个Item 以子控件总高度测算的高度为准 情况2 当item数量超过实际屏幕高度以match_parent为准也就是最大高度 1.4.4 onLayout RecyclerView作为一个容器类控件 继承自ViewGroup。必须实现onLayout方法来子控件进行正确摆放由于我们手写的RecyclerVIew是垂直的摆放是由上至下进行。同时为了不将所有Item全部加载到内存 也需要进行准确的控制 1.4.5 事件拦截 RecyclerView作为一个容器类控件 需要拦截滑动事件用户手指滑动则让所有子Item滑动子Item在滑动中是接收不到任何事件的。当RecyclerVIew静止时子Item需要接收到点击事件 2 RecyclerView适配器与回收池的工作机制 这里我们先以图片的形式了解一下RecyclerView相关的加载逻辑。 2.1 RecyclerView中的第一屏加载 2.2 RecyclerView中的第二屏 2.3 回收池回收策略 2.4 回收池填充策略 2.5 回收池设计 3 RecyclerView回收与复用 3.1 回收的关键方法分析 RecyclerView.java void recycleViewHolderInternal(ViewHolder holder) {...if (forceRecycle || holder.isRecyclable()) {if (mViewCacheMax 0 !holder.hasAnyOfTheFlags(ViewHolder.FLAG_INVALID| ViewHolder.FLAG_REMOVED| ViewHolder.FLAG_UPDATE| ViewHolder.FLAG_ADAPTER_POSITION_UNKNOWN)) // 1) 先尝试放到cacheView中int cachedViewSize mCachedViews.size();if (cachedViewSize mViewCacheMax cachedViewSize 0) {// 如果 mCachedViews 已经满了把第0个位置的移除并放到 缓存池中recycleCachedViewAt(0);cachedViewSize--;}if (!cached) {// 2 如果CacheView中没放进去就放到 缓存池中addViewHolderToRecycledViewPool(holder, true);recycled true;}... }3.2 复用的关键方法分析 tryGetViewHolderForPositionByDeadline 从一级缓存 mChangeScrap 中取 从二级缓存 mCachedViews中取 从三级缓存 mViewCacheExtension 中取 从四级缓存 缓存池中取 缓存中都没有拿到值就直接创建 未绑定过时进行绑定 ViewHolder tryGetViewHolderForPositionByDeadline(int position,boolean dryRun, long deadlineNs) {ViewHolder holder null;// 1) 从一级缓存 changed scrap 中取if (mState.isPreLayout()) {holder getChangedScrapViewForPosition(position);fromScrapOrHiddenOrCache holder ! null;}// 2从二级缓存 cache中取if (holder null) {final int type mAdapter.getItemViewType(offsetPosition);if (mAdapter.hasStableIds()) {holder getScrapOrCachedViewForId(mAdapter.getItemId(offsetPosition),type, dryRun);if (holder ! null) {// update positionholder.mPosition offsetPosition;fromScrapOrHiddenOrCache true;}}// 3. 从三级缓存 CacheExtension 中取 if (holder null mViewCacheExtension ! null) {final View view mViewCacheExtension.getViewForPositionAndType(this, position, type);if (view ! null) {holder getChildViewHolder(view);}}// 4) 从四级缓存 缓存池中取if (holder null) { // fallback to poolholder getRecycledViewPool().getRecycledView(type);if (holder ! null) {holder.resetInternal();if (FORCE_INVALIDATE_DISPLAY_LIST) {invalidateDisplayListInt(holder);}}}// 5缓存中都没有拿到值就直接创建if (holder null) {holder mAdapter.createViewHolder(RecyclerView.this, type);if (ALLOW_THREAD_GAP_WORK) {// only bother finding nested RV if prefetchingRecyclerView innerView findNestedRecyclerView(holder.itemView);if (innerView ! null) {holder.mNestedRecyclerView new WeakReference(innerView);}}long end getNanoTime();mRecyclerPool.factorInCreateTime(type, end - start);if (DEBUG) {Log.d(TAG, tryGetViewHolderForPositionByDeadline created new ViewHolder);}}}// 6已经 bind过了不会再去绑定未绑定过时进行绑定if (mState.isPreLayout() holder.isBound()) {holder.mPreLayoutPosition position;} else if (!holder.isBound() || holder.needsUpdate() || holder.isInvalid()) {final int offsetPosition mAdapterHelper.findPositionOffset(position);// 尝试 bindViewbound tryBindViewHolderByDeadline(holder, offsetPosition, position, deadlineNs);}return holder; }4 四级缓存机制 4.1 一级缓存-缓存碎片 ViewHolder getChangedScrapViewForPosition(int position) {// If pre-layout, check the changed scrap for an exact match.final int changedScrapSize;if (mChangedScrap null || (changedScrapSize mChangedScrap.size()) 0) {return null;}// find by positionfor (int i 0; i changedScrapSize; i) {final ViewHolder holder mChangedScrap.get(i);if (!holder.wasReturnedFromScrap() holder.getLayoutPosition() position) {holder.addFlags(ViewHolder.FLAG_RETURNED_FROM_SCRAP);return holder;}}// find by idif (mAdapter.hasStableIds()) {final int offsetPosition mAdapterHelper.findPositionOffset(position);if (offsetPosition 0 offsetPosition mAdapter.getItemCount()) {final long id mAdapter.getItemId(offsetPosition);for (int i 0; i changedScrapSize; i) {final ViewHolder holder mChangedScrap.get(i);if (!holder.wasReturnedFromScrap() holder.getItemId() id) {holder.addFlags(ViewHolder.FLAG_RETURNED_FROM_SCRAP);return holder;}}}}return null; }4.2 二级缓存-缓存列表 ViewHolder getScrapOrCachedViewForId(long id, int type, boolean dryRun) {// 1) 先从mAttachedScrap中取取到便返回final int count mAttachedScrap.size();for (int i count - 1; i 0; i--) {final ViewHolder holder mAttachedScrap.get(i);if (holder.getItemId() id !holder.wasReturnedFromScrap()) {if (type holder.getItemViewType()) {holder.addFlags(ViewHolder.FLAG_RETURNED_FROM_SCRAP);if (holder.isRemoved()) {if (!mState.isPreLayout()) {holder.setFlags(ViewHolder.FLAG_UPDATE, ViewHolder.FLAG_UPDATE| ViewHolder.FLAG_INVALID | ViewHolder.FLAG_REMOVED);}}return holder;} else if (!dryRun) {mAttachedScrap.remove(i);removeDetachedView(holder.itemView, false);quickRecycleScrapView(holder.itemView);}}}// 2二级缓存从mCachedViews中取final int cacheSize mCachedViews.size();for (int i cacheSize - 1; i 0; i--) {final ViewHolder holder mCachedViews.get(i);//从mCachedViews中取到后便返回if (holder.getItemId() id) {if (type holder.getItemViewType()) {if (!dryRun) {mCachedViews.remove(i);}return holder;} else if (!dryRun) {recycleCachedViewAt(i);return null;}}}return null;}4.3 三级缓存-自定义缓存 这一级缓存为用户自定义这里不做详解。 4.4 四级缓存-缓存池 public ViewHolder getRecycledView(int viewType) {//从mScrap中根据view的类型来取出一个final ScrapData scrapData mScrap.get(viewType);if (scrapData ! null !scrapData.mScrapHeap.isEmpty()) {final ArrayListViewHolder scrapHeap scrapData.mScrapHeap;//从 scrapData 中拿最后一个数据先进后出return scrapHeap.remove(scrapHeap.size() - 1);}return null; }static class ScrapData {//ViewHolder是作为一个List被存进来的ArrayListViewHolder mScrapHeap new ArrayList();// 缓存池中 list的大小是5也就是每个类型的view缓存池中存储5个int mMaxScrap 5;long mCreateRunningAverageNs 0;long mBindRunningAverageNs 0;}
http://www.huolong8.cn/news/92358/

相关文章:

  • 上海seo优化外包公司沈阳网站的优化
  • 洛阳西工区做网站哪家好如何申请开通网站
  • 在线做效果图的网站网站建设规划书结构
  • 网站首页图片怎么做哪里可以制作网站
  • 用jsp和mysql做网站宁波行业网站建设
  • 在网站上做外贸杭州哪家公司做网站好
  • 青岛建网站的公司有哪些培训方案
  • 网站建设 站内页面连接网站制作价格东莞
  • 百度收录什么网站吗网站与域名
  • 深圳手机医疗网站建设m2型虚拟主机带宽 网站
  • 在哪里做公司网站网站cms系统排名
  • 免费建站模板网站动态表情包在线制作
  • 网站建设有哪些分工分网站建设 慕课
  • 网站敏感关键词烟店网站建设
  • seo优化在线诊断优化设计的答案
  • 建筑网站哪里找我想做个卷帘门网站怎么做
  • dz网站模版wordpress售后主题
  • 传奇服务器网站如何建设wordpress怎么静态页面
  • 查建设工程业绩在哪个网站做网站需要申请商标哪些类目
  • 网站建设 电子书中国最大的外包公司有哪些
  • 建设银行网站怎么开通短信服务聊天软件是怎么开发的
  • 四川成都营销型网站dedecms做网站全教程
  • 网站手机端排名软件四川省住房与城乡建设厅网站官网
  • 绵阳网站建设制作企业手机网站 案例
  • 做网站多少钱一个月广西网络营销外包公司
  • 舟山市建设工程质量监督站网站陕西交通建设集团蓝商公司网站
  • 深圳招聘网站有哪些广州越秀金融大厦
  • 微信二维码网站制作wordpress拖动实现
  • 网站建设取得实效沈阳网络平台推广公司
  • 做pc端网站行情网站顶部悬浮导航代码