View的复用:viewHolder

来源:互联网 发布:淘宝网商银行怎么开通 编辑:程序博客网 时间:2024/06/14 14:01

我们在开发的过程中用到ListView。

一、复用convertView
首先讲下ListView的原理:ListView中的每一个Item显示都需要Adapter调用一次getView的方法,这个方法会传入一个convertView的参数,返回的View就是这个Item显示的View。如果当Item的数量足够大,再为每一个Item都创建一个View对象,必将占用很多内存,创建View对象(mInflater.inflate(R.layout.lv_item, null);从xml中生成View,这是属于IO操作)也是耗时操作,所以必将影响性能。Android提供了一个叫做Recycler(反复循环器)的构件,就是当ListView的Item从上方滚出屏幕视角之外,对应Item的View会被缓存到Recycler中,相应的会从下方生成一个Item,而此时调用的getView中的convertView参数就是滚出屏幕的Item的View,所以说如果能重用这个convertView,就会大大改善性能。

二、使用viewHolder类

我们都知道在getView方法中的操作是这样的:先从xml中创建view对象(inflate操作,我们采用了重用convertView方法优化),然后在这个view去findViewById,找到每一个子View,如:一个TextView等。这里的findViewById操作是一个树查找过程,也是一个耗时的操作,所以这里也需要优化,就是使用viewHolder,把每一个子View都放在Holder中,当第一次创建convertView对象时,把这些子view找出来。然后用convertView的setTag将viewHolder设置到Tag中,以便系统第二次绘制ListView时从Tag中取出。当第二次重用convertView时,只需从convertView中getTag取出来就可以。

实现方式一

public View getView(int position, View convertView, ViewGroup parent) {         ViewHolder holder = null;         if (convertView == null) {             convertView = mInflater.inflate(R.layout.lv_item, null);             holder = new ViewHolder();             holder.textView = (TextView)convertView.findViewById(R.id.tv_text);             convertView.setTag(holder);         } else {             holder = (ViewHolder)convertView.getTag();         }         holder.textView.setText(mData.get(position));         return convertView;     }}  public static class ViewHolder {     public TextView textView; }

实现方式二

    public viewHold viewHold;    private Context mContext;    public View getView(int position, View convertView, ViewGroup parent) {        if (convertView == null) {            convertView = LayoutInflater.from(mContext).inflate(R.layout.item_mainlv, null);            viewHold = new viewHold(convertView);            convertView.setTag(viewHold);        } else {            viewHold= (ViewHolderUtil.viewHold) convertView.getTag();        }       viewHold.mTextView.setText("你要输入的内容");        return convertView;    }    private class viewHold {        TextView mTextView;        public viewHold(View v) {            mTextView = (TextView) v.findViewById(R.id.codecreate_scan);        }    }


三.通过自定义工具:viewHolderUtil

public class ViewHolderUtil {    public static <T extends View> T get(View view, int id) {        SparseArray<View> viewHoler = (SparseArray<View>) view.getTag();        if (viewHoler == null) {            viewHoler = new SparseArray<View>();            view.setTag(viewHoler);        }        View childrenView = viewHoler.get(id);        if (childrenView == null) {            childrenView = view.findViewById(id);            viewHoler.put(id, childrenView);        }        return (T) childrenView;    }

如何实现

 @Override    public View getView(int position, View convertView, ViewGroup parent) {        if (convertView == null) {            convertView = LayoutInflater.from(context).inflate(                    R.layout.item_loglv, null);        }        MyListView listView = ViewHolderUtil.get(convertView, R.id.loglv_lv);        TextView tv = ViewHolderUtil.get(convertView, R.id.loglv_tv);
看上去是不是简单了很多大笑




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 山东省住房城乡建设厅 2019各银行住房商贷利率一览表 住房公积金查询入口 陕西省住房和城乡建设厅网 沧州住房公积金个人查询入口 包头市住房公积金管理中心 佛山住房公积金中心 个人住房商业性贷款 住房公积金装修贷款能贷多少 邵阳住房公积金管理中心 工资4000住房公积金一般交多少 西安住房保障管理局网站 佛山住房公积金 住房城乡建设部 河南省住房和城乡建设厅网 北京住房公积金 广州住房公积金管理中心 西安住房公积金 成都住房公积金管理中心 宜春住房公积金 安徽省住房和城乡建设厅 四川城乡住房建设厅 陕西省住房公积金中心 深圳市住房和建设局 南宁市住房保障和房产管理局 住房公积金是什么 十堰住房公积金查询 广安住房公积金查询 枣庄住房公积金管理中心 南宁市住房公积金查询 陕西住房公积金查询网 南充市住房公积金管理中心 南宁住房公积金 晋中住房公积金查询个人账户 保定住房公积金查询 淮南市住房公积金查询 苏州市住房公积金管理中心 宜春市住房公积金管理中心 住房公积金管理中心电话 福州住房公积金查询 玉林住房公积金查询