美文网首页面试
Android 面试题之Listview(不断更新)

Android 面试题之Listview(不断更新)

作者: 侯蛋蛋_ | 来源:发表于2017-12-05 17:03 被阅读0次

    面试思维导图

    image.png

    以下所有内容以及实用的知识点已被整理app,欢迎下载

    • 下载方式一:酷安商城搜索Android_程序猿即可下载

    • 下载方式二:扫描下载二维码进行下载

    image.png

    Android 面试题之J2EE(不断更新)

    Android 面试题之Activity(不断更新)

    Android 面试题之Service(不断更新)

    Android 面试题之Listview(不断更新)

    Android 面试题之基础(不断更新)

    ListView系列问题

    1.1 ListView卡顿的原因与性能优化,越多越好

    1. 重用converView: 通过复用converview来减少不必要的view的创建,另外Infalte操作会把xml文件实例化成相应的View实例,属于IO操作,是耗时操作。

    2. 减少findViewById()操作: 将xml文件中的元素封装成viewholder静态类,通过converview的setTag和getTag方法将view与相应的holder对象绑定在一起,避免不必要的findviewbyid操作

    3. 避免在 getView 方法中做耗时的操作: 例如加载本地 Image 需要载入内存以及解析 Bitmap ,都是比较耗时的操作,如果用户快速滑动listview,会因为getview逻辑过于复杂耗时而造成滑动卡顿现象。用户滑动时候不要加载图片,待滑动完成再加载,可以使用这个第三方库glide

    4. Item的布局层次结构尽量简单,避免布局太深或者不必要的重绘

    5. 尽量能保证 Adapter 的 hasStableIds() 返回 true 这样在 notifyDataSetChanged() 的时候,如果item内容并没有变化,ListView 将不会重新绘制这个 View,达到优化的目的

    6. 在一些场景中,ScollView内会包含多个ListView,可以把listview的高度写死固定下来。 由于ScollView在快速滑动过程中需要大量计算每一个listview的高度,阻塞了UI线程导致卡顿现象出现,如果我们每一个item的高度都是均匀的,可以通过计算把listview的高度确定下来,避免卡顿现象出现

    7. 使用 RecycleView 代替listview: 每个item内容的变动,listview都需要去调用notifyDataSetChanged来更新全部的item,太浪费性能了。RecycleView可以实现当个item的局部刷新,并且引入了增加和删除的动态效果,在性能上和定制上都有很大的改善

    8. ListView 中元素避免半透明: 半透明绘制需要大量乘法计算,在滑动时不停重绘会造成大量的计算,在比较差的机子上会比较卡。 在设计上能不半透明就不不半透明。实在要弄就把在滑动的时候把半透明设置成不透明,滑动完再重新设置成半透明。

    9. 尽量开启硬件加速: 硬件加速提升巨大,避免使用一些不支持的函数导致含泪关闭某个地方的硬件加速。当然这一条不只是对 ListView。

    1.2 怎么实现一个部分更新的 ListView?(了解)

    1.先通过listView.getChildAt(position)拿到要更新的对应的item布局文件,然后再通过findViewById找到对应的控件进行设置。

    2.通过Item找出对应的ViewHolder,然后通过ViewHolder去设置值

    3.调用适配器对应的getView方法,用它里面的代码对界面进行刷新。这也是google在IO大会上推荐的做法

    private void updateView(int itemIndex) {
              //得到第一个可显示控件的位置,
              int visiblePosition = mListView.getFirstVisiblePosition();
              //只有当要更新的view在可见的位置时才更新,不可见时,跳过不更新
              if (itemIndex - visiblePosition >= 0) {
                  //得到要更新的item的view
                View view = mListView.getChildAt(itemIndex - visiblePosition);
                  //调用adapter更新界面
                 mAdapter.updateView(view, itemIndex);
            }
         }
    

    ListView局部刷新的实现

    1.3 当 ListView 数据集改变后,如何更新 ListView?

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

    1.4 ListView 如何实现分页加载(理解)

    • 1.设 置 ListView 的 滚 动 监 听 器 : setOnScrollListener(new OnScrollListener{….})
      在监听器中有两个方法: 滚动状态发生变化的方法 (onScrollStateChanged)和 listView 被滚动时调用的方法(onScroll)

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

      • 手指按下移动的状态: SCROLL_STATE_TOUCH_SCROLL: // 触摸滑动
      • 惯性滚动(滑翔(flgin)状态): SCROLL_STATE_FLING: // 滑翔 静止状态:
      • SCROLL_STATE_IDLE: // 静止
    • 3.对不同的状态进行处理:
      分批加载数据,只关心静止状态:关心最后一个可见的条目,如果最后一个 可见条目就是数据适配器(集合)里的最后一个,此时可加载更多的数据。在每 次加载的时候,计算出滚动的数量,当滚动的数量大于等于总数量的时候,可以 提示用户无更多数据了。

    1.5 怎么实现ListView多种布局?(了解)

    ListView 显示的每个条目都是通过 baseAdapter 的 getView(int position, View convertView, ViewGroup parent)来展示的,理 论上我们完全可以让每个条目都是不同类型的 view。
    比如:从服务器拿回一个标识为 id=1,那么当 id=1 的时候,我们就加载类 型一的条目,当 id=2 的时候,加载类型二的条目。常见布局在资讯类客户端中 可以经常看到。
    除此之外 adapter 还提供了 getViewTypeCount()和 getItemViewType(int position)两个方法。在 getView 方法中我们可以根据不 同的 viewtype 加载不同的布局文件。

    1.6 ListView 如何定位到指定位置?

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

    1.7 在ListView中设置Selector为null会报空指针? (知道)

    mListView.setSelector(null);//空指针
    试试下面这个:
    mListView.setSelector(new ColorDrawable(Color.TRANSPARENT));

    1.8 ListView中主要有2种监听器:

    • OnItemClickListener: 处理视图中单个条目的点击事件。 (OnItemSelectedListener,参数与其一致,只是监听用户手指行为不同)
    • OnScrollListener:监听滚动变化,可以用于视图滚动中加载数据。

    1.9 ListView中图片错位问题

    每次getView能给对象一个标识,在异步加载完成时比较标识与当前行item的标识是否一致,一致则显示,否则不做处理即可

    // 给 ImageView 设置一个 tag
    holder.img.setTag(imgUrl);
    // 预设一个图片
    holder.img.setImageResource(R.drawable.ic_launcher);
    
    // 通过 tag 来防止图片错位
    if (imageView.getTag() != null &&imageView.getTag().equals(imageUrl)) {
    imageView.setImageBitmap(result);
    }
    

    2.0 ListView与数据库绑定的实现(了解)

    • 第一种是用SimpleAdapter创建

    • 第二种是用SimpleCursorAdapter创建

    两种实现方法

    相关文章

      网友评论

        本文标题:Android 面试题之Listview(不断更新)

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