博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
08 ListView 优化
阅读量:4544 次
发布时间:2019-06-08

本文共 2394 字,大约阅读时间需要 7 分钟。

ListVie的优化


1 固定ListView长宽高

如下图在清单文件中:

原因解释:

我们假设ListView 宽高为Wrap_content那么每次只要ListView加载一个item(某个条目)将会重新计算长宽高带来资源负担;

对比

我们先先来看看适配器的代码(BaseAdapter)

 
package com.fmy.ListViewDemo2.adpater; import java.util.List; import com.fmy.ListViewDemo2.R;import com.fmy.ListViewDemo2.been.Person;   import android.app.Activity;import android.content.Context;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView; public class MyAdpater extends BaseAdapter{     List
list; Context context; class viewHold { TextView tv ; } public MyAdpater(List
list, Context context) { super(); this.list = list; this.context = context; } @Override public int getCount() { Log.e("==", "getCount"); return 3; } @Override public Object getItem(int position) { Log.e("==", "getItem"); return position; } @Override public long getItemId(int position) { Log.e("==", "getItemId"); return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { Log.e("==>>", "POSTION:"+position); View view= null; viewHold tag = null; if (convertView==null){ LayoutInflater inflater = LayoutInflater.from(context); view = inflater.inflate(android.R.layout.simple_spinner_item, parent,false); viewHold hold = new viewHold(); hold.tv=(TextView) view; view.setTag(hold); tag = hold; }else{ view =convertView; tag = (viewHold) view.getTag(); } tag.tv.setText("你好"); return view; } }

  • 我们假设第一种情况设置长宽高为固定值 输出结果:image可以发现输出结果和加载的内容长度一致 证明只执行了三次getView

  • 我们再看看包裹内容的输出结果: image可以看到输出了N多条信息证明执行了getView多次 因为每次你加载一个item就会重新计算ListView的长宽高

2判断缓存View是否存在

public View getView(int position, View convertView, ViewGroup parent)

此方法每次调用都会自动缓存return的View所以 我们只会判断是否View是否存在,如果存在则直接使用 ,如果不存在那么用填充器在生成.

原因:

用户每次滑动一次看到新的Item的时候就会调用getView 如果用户滑动过快 每次填充次数太多生成过多的View 或者内存不足 等导致内存溢出而奔溃掉

代码: 在上面

3保存填充View的子控件对象

原因

我们一般填充一个View 后给其子元素控件赋值 但是用findViewId是会遍历整个ID文件的非常耗费资源因此我们 创建一个对象 里面创建子元素的控件对象,然后在存入View.setTag中 然后我们使用的取出调用即可

转载于:https://www.cnblogs.com/muyuge/p/6152279.html

你可能感兴趣的文章
关于换位思考
查看>>
设置VSS2005使支持通过Internet访问
查看>>
word2010更改样式
查看>>
百家姓
查看>>
Xcode代码提示里的字母含义
查看>>
[CQOI2017]小Q的表格(数论+分块)
查看>>
leetcode59
查看>>
tcp eaddrnotavail
查看>>
同步带传动张紧轮位置估算
查看>>
Access连接字符串
查看>>
python单元测试框架pytest——fixture函数(类似unitest的setup和teardown)
查看>>
Hadoop源码分析8: IPC流程(3)客户端的clients、connections、calls复用
查看>>
[MVC]View
查看>>
Django REST FRAMEWORK swagger(二)model序列化
查看>>
一点随想
查看>>
SVN操作步骤
查看>>
Xianqi UVa 1589
查看>>
无刷新效果统计在线人数
查看>>
2017-2018-2 1723《程序设计与数据结构》问题汇总 (更新完毕)
查看>>
c# 通过反射 实例化类
查看>>