zoukankan      html  css  js  c++  java
  • Adaptert Listview 优化

      这次是关于Listview的优化的,之前一直采用愚蠢的方式来使用listview,出现的情况就是数据多的话下拉的时候会出现卡顿的情况,内存占用多。所以学习了关于listview的优化,并且这也是普遍使用的方法。我们一般来说创建listview的话更常用的是继承BaseAdapter的方式进行实现,因为这样可以自定义list没一个item的布局,根据程序的需求进行定制,一般来说listview所展示的数据都是比较多的,一般也有比较少的。所以,不对adapter进行优化的话,那么每一次拖动listview都需要生成一次布局,这样的话,程序就可能会有卡顿的情况,并且这样的方式占用内存也比较多。主要是 getView(final int position, View convertView, ViewGroup parent){}的区别

      下面这种方式不推荐使用:

    public View getView(final int position, View convertView, ViewGroup parent) {   
        convertView= inflater.inflate(R.layout.activity_layout, null);
        TextView testName = (TextView) convertView
    					    .findViewById(R.id.testName_textview);
        TextView CassetteType = (TextView) convertView
    					    .findViewById(R.id.CassetteType_textview);
        TextView testTimeYear_textview = (TextView) convertView
    					    .findViewById(R.id.testTimeYear_textview);
        testName.setText("Hello");
        CassetteType.setText("Android");
        testTimeYear_textview.setText("Word");
    return view;
    }
    

      比较简单的例子,上面的方式不推荐使用,因为每一次加载item的时候都需要重新加载每一个控件,使得程序占用内存大,还可能会卡卡的感觉。

      推荐下面的方式使用:

    public View getView(final int position, View convertView,ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (null == convertView) {
            viewHolder = new ViewHolder();
            LayoutInflater mInflater = LayoutInflater.from(mContext);
            convertView = mInflater.inflate(R.layout.data_management, null);
            viewHolder.CassetteType = (TextView) convertView
                            .findViewById(R.id.CassetteType_textview);
            viewHolder.testTimeYear_textview = (TextView) convertView
                            .findViewById(R.id.testTimeYear_textview);
            viewHolder.testTime = (TextView) convertView
                            .findViewById(R.id.testTime_textview);
        convertView.setTag(viewHolder); }
    else { viewHolder = (ViewHolder) convertView.getTag(); } testName.setText("Hello"); CassetteType.setText("Android"); testTimeYear_textview.setText("Word"); return convertView; } private static class ViewHolder { TextView CassetteType; TextView testTimeYear_textview; TextView testTime; }

      这种方法的特点便是通过类ViewHolder,进行TextView的定义,Adapter每一次创建一个item的时候先判断convertView是否为空,为空的话就进行findViewById,其中最重要的是这个convertView.setTag(viewHolder);,convertView不为空的话就执行这句viewHolder = (ViewHolder) convertView.getTag();,然后每一个item就不需要重复性的去findViewById布局的每一个view了,这样就能优化listview的加载速度和减少内存使用,原理大概便是这样,可能也没有讲明,没能理解的话,建议搜搜listview优化。

  • 相关阅读:
    DOS系统功能调用与BIOS中断调用 [转自KingofCoders]
    纯手工保护光盘数据(转)
    程序员不错的建议【转】
    初识逆向技术(转)
    Notepad++插件推荐JSMin
    jQuery Ready 与 Window onload 的区别
    Javascript typeof和instanceof判断数据类型
    浅谈Javascript 中几种克隆(clone)方式
    Javascript Array sort排序问题
    不同浏览器对display为none元素的图片处理不一样
  • 原文地址:https://www.cnblogs.com/caoRM/p/4333042.html
Copyright © 2011-2022 走看看