自定义View相关面试题

223 阅读8分钟

目录

一.ListView中图片错位的问题是怎么产生的?有什么好的解决方案?

二.说一说你对RecycleView的认识。

三.RecyclerView与ListView有哪几层缓存机制

四.RecyclerView与ListView这几层缓存机制,有什么区别和相同点

五.请简单描述下View的渲染。(掉帧、卡顿的原因?)

六.请简单说一下View的绘制流程。

六.谈一谈你对view的刷新机制的认识。

七.requestLayout、invalidate与postInvalidate的区别。

八.描述下Activity、Window、View三者的关系与联系。

九.你是怎么优化自定义view的?

十.在自定义view时怎么知道View的大小?

十一.如果创建自定义View,那么如何提供获取View属性的接口?

十二.知道SurfaceView吗?谈一谈你对它的认识?

十三.普通View和SurfaceView的区别?


一.ListView中图片错位的问题是怎么产生的?有什么好的解决方案?

因为ListView使用了离屏缓存机制缓存了convertview,而且是异步的,当整个屏幕刚好能显示7个item时。如果此时上划,从而显示第9个item(注意第8个也是新建的view,不会进行复用),但它是重用第一个item来显示的,而此时又异步进行网络请求第9个item的图片,自然比第一个item的图片加载慢,所以第9个item就显示第1个的图片。而当向下滑动是,因为第9个item的图片此时加载完成,所以第1个item又会复用第9个item的图片,所以这样就会导致图片错乱了。

解决方案是通过imgUrl给ImageView控件设置一个标识,并设置一张默认图片。当向上滑动时,加载完成时判断imgUrl是否一致,一致说明是正确加载的图片,这样即使第1个item的加载图片要比第9个的要快,但因为此时的标识是第9个item的,所以也不会显示第1个item的图片。

android listview使用glide异步加载图片错位,闪烁问题 - it610.com参考网上方法:https://www.jianshu.com/p/f5593b87ee07//获取图像控件的TagStringtag=(String)holder.imgView.getTag();//如果不一样,则设置为默认图片if(!TextUtils.equals(mDataList.get(position).getUrl(),tag)){holder.imgView.setImageRehttps://www.it610.com/article/1290038983128064000.htm

二.说一说你对RecycleView的认识。

1.RecycleView的概述。RecycleView是一个滚动控件,可以看作的ListView的升级版,不仅可以轻松的完成ListView的效果,还可以实现其他效果,例如网格布局、横向滑动、瀑布流。而且还封装优化了ListView的缺点,例如:ViewHolder的复用

2.RecycleView的特点。

  • ①.RecycleView可以轻松实现线性布局、网格布局、横向线性布局、瀑布流,具体通过LayoutManager的子类去指定。GridLayoutManager实现网格布局、LinearLayoutManager实现线性布局StaggeredGridLayoutManager可以实现瀑布流,其中的高度可以根据每个item设置,然后就可以实现高度不同的网格布局,即瀑布流;想要改变分割线可以通过ItemDecoration来设置;
  • ②.想要给子项添加动画则可以通过ItemAnimator来实现;
  • ③.ViewHolder已经封装在RecycleView的Adapter中,可以直接实现其方法就行;
  • ④.RecycleView的点击事件可以由开发者根据需求去自行注册或者继承OnItemTouchListener实现自定义的RecycleView监听器。
  • ⑤.RecyclerView比ListView多两级缓存,支持多个离ItemView缓存,支持开发者自定义缓存处理逻辑,支持所有RecyclerView共用同一个RecyclerViewPool(缓存池)。
  • ⑥.RecyclerView更大的亮点在于提供了局部刷新的接口,通过局部刷新,就能避免调用许多无用的bindView。

3.RecycleView的使用。简单描述下,先实现子项布局item,然后引入RecycleView控件,然后创建自定义的Adapter继承RecycleView的Adapter并实现方法,最后在界面中找到RecycleView,然后将item界面相关数据设置到自定义的Adapter中,最后RecycleView与此Adapter关联。

三.RecyclerView与ListView有哪几层缓存机制

1.ListView有两层缓存机制,分别是

①.mActiveViews屏幕内view复用不需要回调createView与bindView,意义在于快速重用屏幕上可见的列表项ItemView

②.mScrapView即将进入屏幕的view复用,不需要回调createView,需要回调bindView;意义在于缓存离开屏幕的ItemView

2.RecycleView有四层缓存机制,分别是

①.mAttachedScrap屏幕内view复用不需要回调createView与bindView,意义在于快速重用屏幕上可见的列表项ItemView,和ListView的mActiveViews缓存一致

②.mCachedViews即将进入屏幕的view复用,不需要回调createView与bindView,意义在于缓存离开屏幕的ItemView

③.自定义缓存

④.mReyclerViewPool可用于多个RecycleView复用,意义在于可以实现ViewPager+多列表场景下的ItemView缓存

四.RecyclerView与ListView这几层缓存机制,有什么区别和相同点

相同点

①.ListView的屏幕内复用与RecycleView的屏幕内复用缓存功能相似,意义在于快速重用屏幕上可见的列表项ItemView

②.离屏缓存功能相似,意义在于缓存离开屏幕的ItemView,目的是让即将进入的屏幕ItemView重用

不同点

①.离屏缓存ListView需要回调bindView()方法,RecycleView不需要回调bindView() 方法,RecycleView有一个RecycleViewPool缓存池,可以实现ViewPager+多列表场景下的ItemView缓存,ListView没有此功能。

②.RecycleView缓存的是ViewHolder,抽象的可以理解为View+ViewHolder+Flag标识符(标志flag的作用是判断view是否需要重新bindView),ListView缓存的是View。

③.RecyclerView中mCacheViews(屏幕外)获取缓存时,是通过匹配pos获取目标位置的缓存,这样做的好处是,当数据源数据不变的情况下,无须重新bindView,而同样是离屏缓存,ListView从mScrapViews根据pos获取相应的缓存,但是并没有直接使用,而是重新getView(即必定会重新bindView)。

RecyclerView面试必问 - 简书RecyclerView是谷歌官方出的一个用于大量数据展示的新控件,可以用来代替传统的ListView,更加强大和灵活。 同时也希望能通过本文,让大家快速了解Recycler...https://www.jianshu.com/p/d8a23a7e8199

五.请简单描述下View的渲染。(掉帧、卡顿的原因?)

​后续内容参考博客:

​https://blog.csdn.net/gongjdde/article/details/121874617?spm=1001.2014.3001.5501​