Android面试题之Listview篇,rxjava线程切换原理

3.如何刷新 ListView 中单个 item 的数据,不刷新整个 ListView 的数据?


修改单个 Item 的数据,然后调用适配器的 notifyDataSetChanged()方法


4.上拉加载和下拉刷新怎么实现?


实现OnScrollListener 接口重写onScrollStateChanged 和onScroll方法,使用onscroll方法实现”滑动“后处理检查是否还有新的记录,如果有,调用 addFooterView,添加记录到adapter, adapter调notifyDataSetChanged 更新数据;如果没有记录了,把自定义的mFooterView去掉。使用onScrollStateChanged可以检测是否滚到最后一行且停止滚动然后执行加载。


5.ListView 中如何优化图片?


图片的优化策略比较多。

1、处理图片的方式:

如果 ListView 中自定义的 Item 中有涉及到大量图片的,一定要对图片进行细心的处理,因为图片占的内存是 ListView 项中最头疼的,处理图片的方法大致有以下几种:

  • ①、不要直接拿路径就去循环 BitmapFactory.decodeFile;使用 Options 保存图片大小、不要加载图片到内存去。

  • ②、对图片一定要经过边界压缩尤其是比较大的图片,如果你的图片是后台服务器处理好的那就不需要了

  • ③、在 ListView 中取图片时也不要直接拿个路径去取图片,而是以 WeakReference(使用WeakReference代替强引用。比如可以使用 WeakReference mContextRef)、SoftReference、 WeakHashMap 等的来存储图片信息。

  • ④、在 getView 中做图片转换时,产生的中间变量一定及时释放

2、异步加载图片基本思想:

  • 1)、先从内存缓存中获取图片显示(内存缓冲)

  • 2)、获取不到的话从 SD 卡里获取(SD 卡缓冲)

  • 3)、都获取不到的话从网络下载图片并保存到 SD 卡同时加入内存并显示(视情况看是否要显示)

原理:

优化一:先从内存中加载,没有则开启线程从 SD 卡或网络中获取,这里注意从 SD 卡获取图片是放在子线程里执行的,否则快速滑屏的话会不够流畅。

优化二:于此同时,在 adapter 里有个 busy 变量,表示 listview 是否处于滑动状态,如果是滑动状态则仅从内存中获取
图片,没有的话无需再开启线程去外存或网络获取图片。

优化三:ImageLoader 里的线程使用了线程池,从而避免了过多线程频繁创建和销毁,如果每次总是 new 一个线程去执行这是非常不可取的,好一点的用的 AsyncTask 类,其实内部也是用到了线程池。在从网络获取图片时,先是将其保存到 sd 卡,然后再加载到内存,这么做的好处是在加载到内存时可以做个压缩处理,以减少图片所占内存。


6.Listview里有Button点不动?


原因是button强制获取了item的焦点,只要设置button的focusable为false即可。


7.ListView 如何提高其效率?


当 convertView 为空时,用 setTag()方法为每个 View 绑定一个存放控件的 ViewHolder 对象。

当convertView 不为空,重复利用已经创建的 view 的时候,使用 getTag()方法获取绑定的 ViewHolder对象,这样就避免了 findViewById 对控件的层层查询,而是快速定位到控件。

① 复用 ConvertView,使用历史的 view,提升效率 200%

② 自定义静态类 ViewHolder,减少 findViewById 的次数。提升效率 50%

③ 异步加载数据,分页加载数据。

④ 使用 WeakRefrence 引用 ImageView 对象


8.ListView 可以显示多种类型的条目吗?


这个当然可以的,ListView 显示的每个条目都是通过 baseAdapter 的 getView(int position, View convertView,ViewGroup parent)来展示的,理论上我们完全可以让每个条目都是不同类型的view。

比如:从服务器拿回一个标识为 id=1,那么当 id=1 的时候,我们就加载类型一的条目,当 id=2的时候,加载类型二的条目。常见布局在资讯类客户端中可以经常看到。

除此之外 adapter 还提供了 getViewTypeCount()和 getItemViewType(int position)两个方法。在 getView 方法中我们可以根据不同的 viewtype 加载不同的布局文件。


9.ListView 如何定位到指定位置?


可以通过 ListView 提供的 lv.setSelection(listView.getPosition());方法。


10.如何在 ScrollView 中如何嵌入 ListView?


  • 通常情况下我们不会在 ScrollView 中嵌套 ListView,但是如果面试官非让我嵌套的话也是可以的。

  • 在 ScrollView 添加一个 ListView 会导致 listview控件显示不全,通常只会显示一条,这是因为两个控件的滚动事件冲突导致。所以需要通过 listview 中的 item 数量去计算 listview 的显示高度,从而使其完整展示。

  • 现阶段的处理的方式是:自定义 ListView,重载 onMeasure()方法,设置全部显示。


11.ListView 中图片错位的问题是如何产生的?


图片错位问题的本质源于我们的 listview 使用了缓存 convertView,假设一种场景,一个 listview一屏显示九个 item,那么在拉出第十个 item 的时候,事实上该 item 是重复使用了第一个 item,也就是说在第一个 item 从网络中下载图片并最终要显示的时候,其实该 item 已经不在当前显示区域内了,此时显示的后果将可能在第十个 item 上输出图像,这就导致了图片错位的问题。所以解决之道在于可见则显示,不可见则不显示。


12.你知道ListView的setEmptyView方法吗?


能在第十个 item 上输出图像,这就导致了图片错位的问题。所以解决之道在于可见则显示,不可见则不显示。


12.你知道ListView的setEmptyView方法吗?


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值