目录
一.ListView中图片错位的问题是怎么产生的?有什么好的解决方案?
三.RecyclerView与ListView有哪几层缓存机制
四.RecyclerView与ListView这几层缓存机制,有什么区别和相同点
七.requestLayout、invalidate与postInvalidate的区别。
八.描述下Activity、Window、View三者的关系与联系。
十一.如果创建自定义View,那么如何提供获取View属性的接口?
一.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的图片。
二.说一说你对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)。
五.请简单描述下View的渲染。(掉帧、卡顿的原因?)
后续内容参考博客:
https://blog.csdn.net/gongjdde/article/details/121874617?spm=1001.2014.3001.5501