这个东西做android是必备的,我相信你一定也会,但是我写下来的目的就是记录一下。
这个东西面试也很多会问到的,那么我们怎么回答那?
首先我认为有这么几点:
1、listview在定义的时候宽和高最好固定一下,这样可以减少listview测量次数,避免每次加载的时候都要去进行测量。
2、分页加载,这也是优化之一,优化内存,还有体验感,有兴趣的可以试试大数据加载;
3、convertView 就是布局的复用;
4、ViewHolder的使用 目的减少findviewByID的次数;
下面代码验证一下3和4。
public View getView(int position, View convertView, ViewGroup parent) { Log.e("========>>>>>", "getView-----position" + position); convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list, null); return convertView; }
也就是说如果这样写的话每次都会进行布局的填充(滑动一下你就会发现每次都会打印日志),找到相应的布局,如果每次都去填充的话肯定浪费资源,所以我们这样去写
public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list, null); Log.e("========>>>>>", "getView-----position" + position); } else { } return convertView; }
你会看到日志始终是这几个数据(如果你页面显示5个那个这里的数据就应该是六条会比显示的数据多一条)。
ViewHolder
如果不使用viewHolder的话代码就是这样的
public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list, null); } TextView textView = convertView.findViewById(R.id.tv); textView.setText(mArrayList.get(position)); return convertView; }
很明显这段代码每次textview 都得findViewById;你可能会说你可以在if判断里面findViewById啊,然后在if外边赋值啊,你可以试试 你会发现很有意思的事情,上下滑动几次,你会发现数据就会混乱,并且重复数据很多。这样显然是不符合我们的要求的;
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list, null); viewHolder = new ViewHolder(); viewHolder.mTextView = convertView.findViewById(R.id.tv); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.mTextView.setText(mArrayList.get(position)); return convertView; } public static class ViewHolder { private TextView mTextView; }
这样的基本复合我们的要求了,数据不会混乱并且复用了布局还减少了findViewById的次数,这样大大减少了内存的使用。其实这样做有个问题listview item中如果有图片快速滑动你会发现错位的问题,当然这些问题第三方的加载框架一般都可以解决。listview item尽量减少布局的嵌套 还有大图片的加载 容易oom。listview 优化差不多就这些,如果还有其他的更好的优化方法,欢迎留言。
火柴人绳索英雄2无限金币版 (Stickman Rope Hero 2)安卓版v2.2v3.4.2
下载奥特曼之格斗超人内测版本 安卓最新版v11.0.0
下载奥特曼之格斗超人百度版 安卓版v11.0.0
下载奥特曼之格斗超人4399游戏盒版 最新安卓版v11.0.0
下载德凯奥特曼D闪光剑模拟器 安卓版v1.0
德凯奥特曼D闪光剑模拟器是一个非常有趣的奥特曼变身模拟器,可
亚刻觉醒器 安卓版v1.1
亚刻觉醒器模拟器是一个非常有趣的奥特曼变身模拟器,为喜欢亚刻
海上餐厅无限金币版 v1.0
海上餐厅免广告版是游戏的破解版本,在该版本中为玩家去除了广告
阿西美女室友竟然全解锁版 v1.0.2
阿西美女室友竟然内置菜单版是游戏的破解版本,在该版本中为玩家
我是大东家正版 最新版v1.2.738
我是大东家正版是一款放置类模拟经营手游,玩家将回到古代成为家