1.  ViewHolder

感觉ViewHolder就不用多说了吧,这是ListView最基本的优化技巧了。ViewHolder机制使在getView()中避免了每次都要进行findViewById()去实例化控件,通过视图缓存机制重用缓存即可。

在后面ListView加载不同布局中也用到了ViewHolder机制,所以示例代码就不单独贴了。

2. 不要在getView()中进行耗时操作

(1)在getView()中进行耗时操作会造成卡顿,因此诸如加载图片这一类耗时操作,需要用异步的方式处理耗时任务。

(2)还有一点就是要控制异步任务的执行频率,因为当用户频繁的上下滑动,会瞬间产生上百个异步任务,会带来无意义的大量的UI更新操作,因此可以考虑在列表滑动时停止进行异步任务,直到列表停下来。

//判断列表的状态
public void onScrollStateChange(AbsLiatView view, int scrollState){
if(scrollState == OnScrollListener.SCROLL_STATE_IDLE){
mIsViewIdle = true;
}else{
mIsViewIdle = false;
}
}
//在getView()中根据列表状态选择在静止时加载图片
if(mIsViewIdle = true){
imageView.setTag(url);
//通过url异步加载图片到imageView
}

3.  开启硬件加速

从Android3.0开始,Android的2D显示管道被被设计得更加支持硬加速了,硬加速使用GPU承担了所有在View的canvas上执行的绘制操作。有些莫名其妙的卡顿现象可以通过为Activity开启硬件加速来优化,在Manifest中的<activity>标签下进行如下设置。

andorid:hardwareAccelerated=”true”

还可以在运行时使用以下代码禁止个别的View的硬加速,因为硬件加速可能在自定义View出问题。

if(myView.isHardwareAccelerated()){
myView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
}

4.  如何实现ListView中具有不同的布局

我之前做过一个聊天界面,每个ListView的Item都具有A方和B方的所有布局信息,只是在合适的时候hide掉某一方而已,但是后来发现了一个机智的官方也考虑到了这种情况,并推出了两个方法,专门来解决这个问题,这里总结一下。

@Override
public int getItemViewType(int position) {
return type;
} @Override
public int getViewTypeCount() {
return number;
}

上面两个方法,getItemViewType()用来返回第position个条目是何种类型,而getViewTypeCount()则返回不同布局的总数。结合这两种方法,即可在getView中进行灵活判断加载不同的布局了。

下面是实现简单的聊天对话的例子,主要是ListView的部分:

public class ChatItemListViewAdapter extends BaseAdapter {
private List<ChatItemListViewBean> mData;
private LayoutInflater mInflater; public ChatItemListViewAdapter(Context context, List<ChatItemListViewBean> data) {
this.mData = data;
mInflater = LayoutInflater.from(context);
} @Override
public int getCount() {
return mData.size();
} @Override
public Object getItem(int position) {
return mData.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public int getItemViewType(int position) {
ChatItemListViewBean bean = mData.get(position);
return bean.getType();
} @Override
public int getViewTypeCount() {
return 2;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
if (getItemViewType(position) == 0) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.chat_item_itemin, null);
holder.icon = (ImageView) convertView.findViewById(R.id.icon_in);
holder.text = (TextView) convertView.findViewById(R.id.text_in);
} else {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.chat_item_itemout, null);
holder.icon = (ImageView) convertView.findViewById(R.id.icon_out);
holder.text = (TextView) convertView.findViewById(R.id.text_out);
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.icon.setImageBitmap(mData.get(position).getIcon());
holder.text.setText(mData.get(position).getText());
return convertView;
} public final class ViewHolder {
public ImageView icon;
public TextView text;
}
}

其中getViewTypeCount()返回了布局总数为两种,getItemViewType()则实时返回某条目的类型,从而在getView中加载不同的布局,类型信息使用Bean类存储,并在Activity中进行数据的初始化。其中可以看到ViewHolder内部类的应用,在getView中首先会判断convertView是否为空,若为空才去重新加载布局,否则使用缓存。

效果图如下所示,源码地址点击下载

最后在下二篇Android开发——ListView使用技巧总结(二)中介绍一下如何在合适的时候隐藏Toolbar,还有如何实现具有弹性的ListView。

Android开发——ListView使用技巧总结(一)的更多相关文章

  1. Android开发——ListView使用技巧总结(二)

    0.  前言 Android中的ListView是用的比较多的控件之一,在上一篇Android开发--ListView使用技巧总结(一)中对ListView的ViewHolder机制.优化卡顿方式以及 ...

  2. Android之ListView常用技巧

    ListView是一个非常常用的列表控件,虽然在5.x时代ListView的风头正在逐渐的被RecyclerView抢去,但是ListView的使用范围依然十分广泛. 接下来的ListView的常用技 ...

  3. Android开发ListView嵌套ImageView实现单选按钮

    做Android开发两年的时间,技术稍稍有一些提升,刚好把自己实现的功能写出来,记录一下,如果能帮助到同行的其他人,我也算是做了件好事,哈哈!!废话不多说,先上个图. 先上一段代码: if (last ...

  4. ★android开发--ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)

    例子中用于解析Json的Gson请自己Google下载 主Activity: package COM.Example.Main; import java.util.HashMap; import ja ...

  5. Android开发ListView使用OnScrollListener实现分页加载数据

    上篇博文和大家分享了下拉刷新,这是一个用户体验很好的操作方式.新浪微薄就是使用这样的方式的典型. 还有个问题,当用户从网络上读取微薄的时候.假设一下子所有载入用户未读的微薄这将耗费比較长的时间,造成不 ...

  6. Android开发-Listview中显示不同的视图布局

    1. 使用场景 在重写ListView的BaseAdapter时,我们常常在getView()方法中复用convertView,以提高性能.convertView在Item为单一的同种类型布局时,能够 ...

  7. android 开发-ListView与ScrollView事件冲突处理(事件分发机制处理)

    ListView和ScrollView都存在滚动的效果,所以一般不建议listView和scrollView进行嵌套使用,但有些需求则需要用到两者嵌套.在android的学习中学了一种事件分发处理机制 ...

  8. android 开发-ListView列表显示控件的实现

    列表的显示需要三个元素: 1.ListVeiw 用来展示列表的View. 2.适配器 用来把数据映射到ListView上的中介. 3.数据    具体的将被映射的字符串,图片,或者基本组件. 根据列表 ...

  9. Android开发 ListView(垂直滚动列表项视图)的简单使用

    效果图: 使用方法: 1.在布局文件中加入ListView控件: <?xml version="1.0" encoding="utf-8"?> &l ...

随机推荐

  1. EventBus结合rxjava2和retrofit2网络获取

    依赖: compile 'com.squareup.retrofit2:converter-gson:2.3.0'compile 'com.squareup.retrofit2:retrofit:2. ...

  2. 腾讯云部署golang flow流程,vue.js+nginx+mysql+node.js

    这次总算把js-ojus/flow的ui部署到腾讯云上,比较吐槽的就是,为啥这么复杂,vue.js前后端分离,比golang编写的部署方面复杂几万倍.真是浪费人生啊. golang+sqlite写的东 ...

  3. 图片缩放PhoneView

    第一步:导包 implementation 'com.github.chrisbanes:PhotoView:2.0.0' 第二步:加bmob仓库地址 在build.gradle(project)中的 ...

  4. OneAPM大讲堂 | 谁更快?JavaScript 框架性能评测

    文章系国内领先的 ITOM 管理平台供应商 OneAPM 编译呈现. 网页性能是一个丰富且又复杂的话题.在本帖中,我们会将讨论的范围局限在前端 JavaScript 框架上,探究相对于另外一种框架而言 ...

  5. [20171221]利用rman实现2台机器文件拷贝.txt

    [20171221]利用rman实现2台机器文件拷贝.txt --//昨天使用rman duplicate建立dg,我看到执行如下代码: RMAN> duplicate target datab ...

  6. python第八十四天---十五周作业

    后台管理页面: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  7. 3星|《AI极简经济学》:AI的预测、决策、战略等方面的应用案例介绍

    AI极简经济学 主要内容是AI的各种应用案例介绍.作者把这些案例分到五个部分介绍:预测.决策.工具.战略.社会. 看书名和介绍以为会从经济学的角度解读AI,有更多的新鲜的视角和观点,读后比较失望,基本 ...

  8. Leviticus

    The head is empty and empty. Just practicing English will not have any effect. The best effect is to ...

  9. el-table-column v-if条件渲染报错h.$scopedSlots.default is not a function

    我们在实际项目中经常会遇到el-table-column条件渲染出现报错的情况 报错内容: h.$scopedSlots.default is not a function 究其原因,是因为表格是el ...

  10. 描述整体程序的 app

    一个小程序主体部分由三个文件组成,必须放在项目的根目录,如下 app.js文件 App() 函数用来注册一个小程序.接受一个 object 参数,其指定小程序的生命周期函数等.object参数说明如下 ...