志不强者智不达,言不信者行不果。这篇文章主要讲述Android开发中常用的ListView列表的优化方式ViewHolder相关的知识,希望能为你提供帮助。
在android开发中难免会遇到大量的数据加载到ListView中进行显示,
然后其中最重要的数据传递桥梁Adapter适配器是常用的,随着市场的需
求变化ListView‘条目中的内容是越来越多这就需要程序员来自定义适配器,
而关键的就是适配器的优化问题,适配器没有优化好往往就会造成OOM
(内存溢出)或者是滑动卡顿之类的问题,接下来我就给大家介绍一种常
用的Adapter优化方法
1/** 2* list View的适配器 3*/ 4class Adapter extends BaseAdapter { 5 6/** 7* 返回item条目总数 8* 9* @return 10*/ 11@Override 12public int getCount() { 13return newsInfos.size(); 14} 15 16/** 17* 次方法返回的是Object类型的,可以返回任意类型的数据 18* 我这里返回的是一个java ben集合中的一个ben对象 19* 20* @param position 21* @return 22*/ 23@Override 24public Object getItem(int position) { 25return newsInfos.get(position); 26} 27 28/** 29* 返回item所在的位置,从0开始计数的 30* 31* @param position 32* @return 33*/ 34@Override 35public long getItemId(int position) { 36return position; 37} 38 39/** 40* 定义一个ViewHolder对象 41*/ 42ViewHolder holder; 43 44/** 45* 此方法返回一个item的View 46* 47* @param positionlistView中item的位置 48* @param convertView 这个convertView其实就是最关键的部分原理上讲 当ListView滑动的过程中 会有item被滑出屏幕 而不再被使用 这时候Android会回收这个条目的view 这个view也就是这里的convertView 49*当item1被移除屏幕的时候 我们会重新new一个View给新显示的item_new 而如果使用了这个convertView 我们其实可以复用它 这样就省去了new View的大量开销 50* @param parentparent是item的view的父视图,调整item宽高用的 不常用 51* @return 52*/ 53@Override 54public View getView(int position, View convertView, ViewGroup parent) { 55 56if (convertView == null) { 57convertView = View.inflate(HomeActivity.this, R.layout.list_item, null); 58} 59 60//先都与优化没多大关系了都是设置每个控件的数据 61holder = getHolder(convertView); 62holder.com.setText(newsInfos.get(position).getComment() + "次浏览"); 63holder.type.setText(getType(newsInfos.get(position).getType())); 64holder.time.setText(newsInfos.get(position).getTime()); 65holder.desc.setText(newsInfos.get(position).getDescription()); 66holder.title.setText(newsInfos.get(position).getTitle()); 67String timeId = newsInfos.get(position).getId(); 68String stats = SharePrefenceUtils 69.getInstance(HomeActivity.this).getStr("new_item" + timeId, ""); 70if (TextUtils.equals(timeId, stats)) { 71holder.stats.setText("已读"); 72holder.stats.setSelected(true); 73} else { 74holder.stats.setText("未读"); 75holder.stats.setSelected(false); 76} 77holder.icon.setImageUrl(newsInfos.get(position).getImage(), null); 78return convertView; 79} 80 81/** 82* 得到ViewHolder 83* 84* @param view 85* @return 86*/ 87public ViewHolder getHolder(View view) { 88//通过传递进来的view 的getTag方法获得holder 89ViewHolder holder = (ViewHolder) view.getTag(); 90if (holder == null) { 91//如果传递进来的View没有设置Tag,就重新new一个holder实例 92holder = new ViewHolder(view); 93//给传递进来的view设置tag 94view.setTag(holder); 95} 96//返回holder 97return holder; 98} 99 100/** 101* 定义一个ViewHolder类 102*/ 103class ViewHolder { 104//下面定义的属性控件都是listView中item里有的控件 105TextView title; 106TextView desc; 107TextView time; 108TextView type; 109TextView com; 110TextView stats; 111SmartImageView icon; 112 113/** 114* 创建该类的实例时需要传入item的view 115* 来得到item中各个控件的实例 116* 117* @param view 118*/ 119public ViewHolder(View view) { 120title = (TextView) view.findViewById(R.id.tv_title); 121icon = (SmartImageView) view.findViewById(R.id.iv_icon); 122desc = (TextView) view.findViewById(R.id.tv_desc); 123time = (TextView) view.findViewById(R.id.tv_time); 124type = (TextView) view.findViewById(R.id.tv_type); 125com = (TextView) view.findViewById(R.id.tv_com); 126stats = (TextView) view.findViewById(R.id.tv_stats); 127} 128} 129}
最后给大家瞧瞧我实现的效果图把,如果有对item样式感兴趣的朋友们请在下方留言我会再写一篇关于android中自定义样式的文章
【Android开发中常用的ListView列表的优化方式ViewHolder】
文章图片
推荐阅读
- Java/Android中的函数调用&回调函数&自定义回调函数
- APP接口自动化测试JAVA+TestNG之HTTP接口测试实例
- 第7章 Android中访问网络资源
- Mapper 动态代理方式
- android ——悬浮按钮及可交互提示
- Android——谷歌官方下拉刷新控件SwipeRefreshLayout(转)
- android ——滑动菜单
- WPF 10天修炼 - Application全局应用程序类
- JavaSE8基础 StringBuffer append 向缓冲区中变量的末尾追加字符串与缓冲区容量的自动扩充