首页 > 编程知识 正文

有面试过initial的吗,产品总监面试一般会问什么

时间:2023-05-03 18:35:40 阅读:135425 作者:4887

RecyclerView是谷歌官方发布的用于大量数据显示的新控件,可以代替传统的ListView,功能更强大、更灵活。

此外,本文还希望简要介绍RecyclerView和ListView缓存机制下的面试。

ListView和RecyclerView缓存机制的原理大致相似,如下图所示。

在此过程中,离开屏幕的ItemView被回收到缓存中,进入屏幕的ItemView优先从缓存中获取。 但是,ListView和RecyclerView的实现细节存在差异。 (这是缓存使用的场景之一,还有刷新等。)

比较

1.1缓存机制1.1.1腾讯面试RecyclerView缓存机制(RecyclerView和ListView缓存机制的层数) RecyclerView比ListView多两级缓存

具体如下:ListView(两级缓存):

RecyclerView(四级缓存):

1.1.2腾讯面试RecyclerView缓存机制(与RecyclerView和ListView几层缓存机制的不同之处)相同点

ListView和RecyclerView缓存机制基本一致:

mActiveViews和mAttachedScrap的功能相似。 这意味着重用屏幕上显示的列表项ItemView,不需要重新创建view和绑定view。

mScrapView和mCachedViews mReyclerViewPool的功能相似,意味着缓存离开画面的ItemView,其目的是复用即将进入画面的ItemView。

RecyclerView的优点是使用a.mCacheViews。 这样,当屏幕外的列表项目ItemView进入屏幕时,就不需要快速重用绑定view。 b.mRecyclerPool可以在多个RecyclerView中共同使用,对于特定的场景,例如viewpaper的多个列表页面是有利的。 客观地说,RecyclerView在特定场景下加强和完善了监听器的缓存机制。

不同点

RecyclerView缓存RecyclerView.ViewHolder。 抽象化可以理解为识别viewviewholder (为了不在每次创建视图时调用findViewById ) (flag )状态)。

列出视图缓存视图。

根据缓存的不同,两者在缓存的使用上略有不同。 具体而言,ListView获取缓存的过程:

RecyclerView获取缓存的过程:

当RecyclerView中的mCacheViews (屏幕外)检索缓存时,它会从匹配的pos中检索目标位置的缓存。 如果数据源中的数据不改变,则不需要重新绑定view,并且即使是同一个离屏缓存,ListView也可以从mScrapViews中获取相应的缓存

//AbsListView源代码: line2345//在匹配pos上从mScrapView缓存finalviewscrapview=m recycler.getscrapview (position ); //无论是否成功,都将直接调用getView,并始终调用createviewfinalviewchild=m adapter.getview (position,scrapView,this )=空(if ) child!==scrapview (m recycler.addscrapview ) scrap view,position ); } else { . }} ListView中通过pos获取的是view,即posview;

RecyclerView中通过pos获取的是viewholder,即pos (view,viewHolder,flag);

从本流程图可以看出,标志标志的作用是确定view是否需要重新绑定view,这也是RecyclerView实现局部刷新的核心。

1.2缓存局部刷新1.2.1字节RecyclerView问题(在RecyclerView的局部刷新中,与ListView有什么区别) )综上所述,RecyclerView的缓存机制确实

通过局部刷新,就能避免调用许多无用的bindView。

结合RecyclerView的缓存机制,看看局部刷新是如何实现的:

以RecyclerView中notifyItemRemoved(1)为例

最终会调用requestLayout(),使整个RecyclerView重新绘制,过程为: onMeasure()–>onLayout()–>onDraw()

其中,onLayout()为重点,分为三步:

dispathLayoutStep1():记录RecyclerView刷新前列表项ItemView的各种信息,如Top,Left,Bottom,Right,用于动画的相关计算;

dispathLayoutStep2():真正测量布局大小,位置,核心函数为layoutChildren();

dispathLayoutStep3():计算布局前后各个ItemView的状态,如Remove,Add,Move,Update等,如有必要执行相应的动画.

其中,layoutChildren()流程图:

当调用notifyItemRemoved时,会对屏幕内ItemView做预处理,修改ItemView相应的pos以及flag(流程图中红色部分):

当调用fill()中RecyclerView.getViewForPosition(pos)时,

1.2.2缓存刷新机制总结(ListView和RecyclerView最大的区别在于数据源改变时的缓存的处理逻辑)

RecyclerView通过对pos和flag的预处理,使得bindview只调用一次.

ListView是”一锅端”,将所有的mActiveViews都移入了二级缓存mScrapViews,

而RecyclerView则是更加灵活地对每个View修改标志位,区分是否重新bindView。

1.2.2 字节RecyclerView面试题(相对于ListView RecyclerView 具备哪些优点)

RecyclerView 相比 ListView 在基础使用上的区别主要有如下几点:

ViewHolder 的编写规范化了

RecyclerView 复用 Item 的工作 Google 全帮你搞定,不再需要像 ListView 那样自己调用 setTag

RecyclerView 需要多出一步 LayoutManager 的设置工作

1 更加方便的实现自定义功能

Android 优雅的为RecyclerView添加HeaderView和FooterView

Android 默认提供的 RecyclerView 就能支持 线性布局、网格布局、瀑布流布局 三种 ,而且同时还能够控制横向还是纵向滚动。怎样,从效果上足以碾压 ListView 有木有。

横向滚动的ListView开源控件是不是可以不用再找了?对,你没看错!
瀑布流效果的开源控件是不是可以不用再找了?对,你没看错!
连横向滚动的GridView都不用找了!对,你没看错!

2 自定义LayoutManager

而 LayoutManager 只是一个抽象类而已,系统已经为我们提供了三个相关的实现类:

LinearLayoutManager(线性布局效果)

GridLayoutManager(网格布局效果)

StaggeredGridLayoutManager(瀑布流布局效果)

RecyclerView 基础使用关键点同样有两点:

继承重写 RecyclerView.Adapter 和 RecyclerView.ViewHolder;

设置布局管理器,控制布局效果

系统也为我们提供了两个默认的动画实现:SimpleItemAnimator 和 DefaultItemAnimator。而 RecyclerView 在不手动调用 setItemAnimator 的情况下,则默认用了内置的 DefaultItemAnimator 。

RecyclerView缓存机制总结

主要靠三个内部类来完成,

Recycler

ViewCacheExtension

RecyclerViewPool:

首先通过 recycler.getViewForPosition()方法,该方法返回ViewHolder对象,通过源码可以知道,该方法会检查mAttachedScrap和一级缓存列表mCachedViews,如果有则返回ViewHolder进行复用。

然后调用ViewCacheExtension.getViewForPositionAndType()方法,注意这个方法是抽象方法,需要开发者进行重写。

最后检查RecyclerViewPool是否有ViewHolder。

注意:上述的三个步骤中,只要有一个返回了ViewHolder,就不会在进行后边的步骤了。 最后:缓存的数量:默认的一级缓存中,mCachedViews中可以缓存的ViewHolder的个数是2;默认的缓存池中的缓存数量是 5;所以在缓存时,会先检测一级缓存是否满了,如果没满就add进去,如果满了就加入到三级缓存Recyclerpool

最后

小编在网上收集了一些 Android 开发相关的学习文档、面试题、Android 核心笔记等等文档,希望能帮助到大家学习提升,如有需要学习参考的可以直接去我 GitHub地址:https://github.com/733gh/Android-T3访问查阅。



版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。