关于android中listview-adapter的viewholder及settag的探究
来源:互联网 发布:极品五笔2013优化版 编辑:程序博客网 时间:2024/05/01 16:21
引言
今天无意中翻看项目代码,发现有一个list-adapter没有使用viewholder也没有使用settag、gettag,心里很紧张,这个页面使用频率很高,如果oom可不好。奇怪,为什么没有测试和我反映呢?
分析问题
项目里使用了网络上的一个ViewFindUtils类,里面有一个hold方法和一个find方法,我的listview中只调了find方法,find方法里只是一个findviewbyid,没有使用viewholder,自然也就没有settag及gettag。
public static <T extends View> T find(View view, int id){ return (T) view.findViewById(id);}
我先想先用ViewFindUtils类里,另外一个hold方法(看注释是万能holder),结果用不了,却一直报错java.lang.ClassCastException: java.lang.String cannot be cast to android.util.SparseArray,在github上找了好多相同的代码,却看不到使用那段代码的语句,索性先放一放。
写代码分析
一直很好奇,安卓listview最大支持多少条目,今天试了一下,每个item包含一个imageview,一个textview。
public class MyListAdapter extends BaseAdapter { private List<String> mTestList; private Context mContext; private LayoutInflater mInflater; public MyListAdapter(Context context) { this.mContext = context; this.mInflater = LayoutInflater.from(mContext); mTestList = new ArrayList<String>(); for (int i = 0; i < 1000000; i++) { mTestList.add("第"+i+"个"); } } @Override public int getCount() { return mTestList.size(); } @Override public Object getItem(int position) { return mTestList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null){ convertView = mInflater.inflate(R.layout.item_lsv_main, null); } //暂时啥也不干,不settag,不gettag return convertView; }}
在没有findviewbyid没有viewholder的情况下,不断加大数据源,最终在红米2手机上测的150万数据会oom。
这里以100万数据源作为测试:
1.加上以下语句
TextView nameTxtv = (TextView) onvertView.findViewById(R.id.item_name_txtv); nameTxtv.setText(mTestList.get(position));
很流畅,依然不会奔溃。
2.多加几个findviewbyid
几乎没影响
3.加入viewholder、settag、gettag
依然很流畅
4.去掉if(convertView == null)这个条件
拖拽时候会卡断,拖的越快,卡的越厉害,但是没有oom
结论:
原来listview的adapter设配器,只要用到if(convertView == null)这个条件,相对来说就没啥影响,即使不使用viewholder,也没多大关系,程序不会oom。但是呢,为了节省点内存,尽量还是加上吧,或者直接使用万能adapter,这些代码一行都不用管。
- 关于android中listview-adapter的viewholder及settag的探究
- 关于android的Adapter出错的探究
- ListView的adapter(用到ViewHolder和convertview)
- Android中优化ListView的ViewHolder模式
- Android中利用ViewHolder优化自定义Adapter的典型写法(讨论ViewHolder的修饰方式)
- 关于Adapter和ViewHolder的另类写法
- ListView的适配器中viewHolder
- RecyclerView中Adapter和ViewHolder的封装
- 关于ListView中ViewHolder修饰符的问题
- android:layout_weight及listView的Adapter
- 对listview adapter的getview方法的新认识viewholder
- Android中setTag的用法
- viewHolder,setTag,getTag,setId,getId的使用
- ListView的优化使用-抽取ViewHolder以及adapter类
- Android探究--使用ViewHolder提高ListView效率
- listview的优化及viewholder的使用
- Android ListView 中Adapter的使用及listView的动态加载
- ListView的Adapter有多个ViewHolder的时候导致的ViewHolder类型转换错误!
- HTML5中的视频音频使用详解
- 使用百度地图和支付宝SDK时遇到的坑
- linux下objdump命令用法介绍及如何使用objdump命令进行反汇编
- liux下的三个时间
- Struts标签、Ognl表达式、el表达式、jstl标签库这四者之间的关系和各自作用
- 关于android中listview-adapter的viewholder及settag的探究
- 关于Application得到上下文,getApplicationContext方法 空指针问题。
- JNI内存泄露处理方法汇总
- 2015——致我那终将逝去的青春
- gradle持续集成部署问题
- Android中WebView与JS交互
- MyEclipse8.5中安装Spket插件
- 使用faster rcnn训练自己的模型
- 存储过程实例1:idc_oemp.prws_external_contacts_search