面试思维导图
image.png以下所有内容以及实用的知识点已被整理app,欢迎下载
-
下载方式一:酷安商城搜索Android_程序猿即可下载
-
下载方式二:扫描下载二维码进行下载
ListView系列问题
1.1 ListView卡顿的原因与性能优化,越多越好
-
重用converView: 通过复用converview来减少不必要的view的创建,另外Infalte操作会把xml文件实例化成相应的View实例,属于IO操作,是耗时操作。
-
减少findViewById()操作: 将xml文件中的元素封装成viewholder静态类,通过converview的setTag和getTag方法将view与相应的holder对象绑定在一起,避免不必要的findviewbyid操作
-
避免在 getView 方法中做耗时的操作: 例如加载本地 Image 需要载入内存以及解析 Bitmap ,都是比较耗时的操作,如果用户快速滑动listview,会因为getview逻辑过于复杂耗时而造成滑动卡顿现象。用户滑动时候不要加载图片,待滑动完成再加载,可以使用这个第三方库glide
-
Item的布局层次结构尽量简单,避免布局太深或者不必要的重绘
-
尽量能保证 Adapter 的 hasStableIds() 返回 true 这样在 notifyDataSetChanged() 的时候,如果item内容并没有变化,ListView 将不会重新绘制这个 View,达到优化的目的
-
在一些场景中,ScollView内会包含多个ListView,可以把listview的高度写死固定下来。 由于ScollView在快速滑动过程中需要大量计算每一个listview的高度,阻塞了UI线程导致卡顿现象出现,如果我们每一个item的高度都是均匀的,可以通过计算把listview的高度确定下来,避免卡顿现象出现
-
使用 RecycleView 代替listview: 每个item内容的变动,listview都需要去调用notifyDataSetChanged来更新全部的item,太浪费性能了。RecycleView可以实现当个item的局部刷新,并且引入了增加和删除的动态效果,在性能上和定制上都有很大的改善
-
ListView 中元素避免半透明: 半透明绘制需要大量乘法计算,在滑动时不停重绘会造成大量的计算,在比较差的机子上会比较卡。 在设计上能不半透明就不不半透明。实在要弄就把在滑动的时候把半透明设置成不透明,滑动完再重新设置成半透明。
-
尽量开启硬件加速: 硬件加速提升巨大,避免使用一些不支持的函数导致含泪关闭某个地方的硬件加速。当然这一条不只是对 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);
}
}
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创建
网友评论