Android面试题之Listview篇

作者: Android开发架构师 | 来源:发表于2020-10-12 15:49 被阅读0次

    前言

    秋招在即,急忙在国庆假期结束后整理一套Android面试题籍,希望对大家有所帮助。0


    提示:以下是本篇文章正文内容

    ListView

    1.当 ListView 数据集改变后,如何更新 ListView

    使用该 ListView 的 adapter 的 notifyDataSetChanged()方法。该方法会使 ListView 重新绘制。


    2.ListView 如何实现分页加载

    ① 设置 ListView 的滚动监听器:setOnScrollListener(new OnScrollListener{….})

    在监听器中有两个方法:滚动状态发生变化的方法(onScrollStateChanged)和 listView 被滚动时调用的方法(onScroll)

    ② 在滚动状态发生改变的方法中,有三种状态:

    • 手指按下移动的状态: SCROLL_STATE_TOUCH_SCROLL: // 触摸滑动
    • 惯性滚动(滑翔(flgin)状态): SCROLL_STATE_FLING: // 滑翔
    • 静止状态: SCROLL_STATE_IDLE: // 静止

    对不同的状态进行处理:

    分批加载数据,只关心静止状态:关心最后一个可见的条目,如果最后一个可见条目就是数据适配器(集合)里的最后一个,此时可加载更多的数据。在每次加载的时候,计算出滚动的数量,当滚动的数量大于等于总数量的时候,可以提示用户无更多数据了。


    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方法吗?

    在Android开发中,用ListView显示数据时,如果数据为空,通常需要显示一个提示视图,而setEmptyView便可解决此问题

    关于整理问题

    以全部整理完毕成pdf格式,以方便阅读,如需完整文档可以简信我【666】或点击【GitHub地址】进行获取!!!

    相关文章

      网友评论

        本文标题:Android面试题之Listview篇

        本文链接:https://www.haomeiwen.com/subject/jaoupktx.html