• 三种Adapter实践


    安卓ListView三种Adapter实践

    主体页面

    ArrayAdapter 效果

    SimpleAdapter效果

    BaseAdapter效果及其解释

    BaseAdapter三种实现方法日志文件展示

    方法一

    很明显,第一种方法对于每个item框图都会调用一次getView方法,重新mInflater.inflate一个新的对象,此时随着列表的下拉,整体的速度会显著下降。 原本创建的itemView会直接被销毁,滑动到对应的列表项时会重新进行创建。

    public View getView(int position, View convertView, ViewGroup parent) {
         View itemview = mInflater.inflate(R.layout.listview_item_bt,null);
         // 创建一个视图对象,存放item
         ImageView img = (ImageView)itemview.findViewById(R.id.album_thumb);
         TextView title = (TextView)itemview.findViewById(R.id.album_title);
         TextView info = (TextView)itemview.findViewById(R.id.album_info);
         ImageButton btn =(ImageButton)itemview.findViewById(R.id.album_btn);
         // 获取id,存放在item之中
         HashMap<String,Object> data = mData.get(position);
         /// hashmap存放的数据进行获取
         img.setImageResource((Integer)data.get("thumb"));
         title.setText(data.get("title").toString());
         info.setText(data.get("info").toString());
         // 设置该位置的item
         Log.e("BaseAdapter",position + itemview.toString());
         return itemview;
    }
    

    日志文件

    方法二

    该方法采用convertView存放之前的View对象,减少对象的创建,实现复用,列表的创建和布局刷新时间会大大减少,但是重复调用getView方法,获取id也需要大量时间。

         @Override
         //方法二
         public View getView(int position, View convertView, ViewGroup parent) {
             if(convertView == null)
                 convertView = mInflater.inflate(R.layout.listview_item_bt,null);
                 // 如果为空就创建 否则直接复用之前的View对象
             ImageView img = (ImageView)convertView.findViewById(R.id.album_thumb);
             TextView title = (TextView)convertView.findViewById(R.id.album_title);
             TextView info = (TextView)convertView.findViewById(R.id.album_info);
             ImageButton btn =(ImageButton)convertView.findViewById(R.id.album_btn);
             HashMap<String,Object> data = mData.get(position);
             img.setImageResource((Integer)data.get("thumb"));
             title.setText(data.get("title").toString());
             info.setText(data.get("info").toString());
             Log.e("BaseAdapter2",position+convertView.toString());
             return convertView;
         }
    

    方法三

    创建一个ViewHolder类,实现对于所有空间对象的保留,使得所有的对象id不必重复获取,在方法二的基础之上,效率更高

    此时的item对象会重复利用,往下拉的同时,新的图片和数据项会覆盖之前上方的itemView对象,重新显示在下方。

        public final class ViewHolder{
                public ImageView album_thumb;
                public TextView album_title;
                public TextView album_info;
                public ImageButton album_btn;
                View wholesView;
            }
            /// 自定义内部类,用于对子项控件的实例进行缓存。
            @Override
            public View getView(final int position, View convertView, ViewGroup parent) {
                ViewHolder holder = null;
                if(convertView == null) {
                    convertView = mInflater.inflate(R.layout.listview_item_bt, parent,false);
                    //   可以被重用的视图   两个参数  第一个参数就是   分布的资源id   第二个就是填充的根视图
                    holder = new ViewHolder();
                    //
                    holder.album_thumb = (ImageView) convertView.findViewById(R.id.album_thumb);
                    holder.album_title = (TextView) convertView.findViewById(R.id.album_title);
                    holder.album_info = (TextView) convertView.findViewById(R.id.album_info);
                    holder.album_btn = (ImageButton) convertView.findViewById(R.id.album_btn);
                    holder.wholesView = convertView;
                    convertView.setTag(holder);
                }
                else
                    holder = (ViewHolder) convertView.getTag();
                HashMap<String,Object> data = mData.get(position);
                holder.album_thumb.setImageResource((Integer)data.get("thumb"));
                holder.album_title.setText(data.get("title").toString());
                holder.album_info.setText(data.get("info").toString());
                holder.album_btn.setTag(position);
                //Log.e("BaseAdapter3",convertView.toString());
                /// 强调复用
                holder.album_btn.setOnClickListener(new View.OnClickListener()
                {
                    @Override
                    public void onClick(View v) {
                        showInfo(position);
                    }
                });
                Log.e("BaseAdapter3",position+":"+convertView.toString());
                return convertView;
    }
    

    齐芒行,川锋明!
  • 相关阅读:
    object sender和EventArgs e含义
    将十进制小数转化为二进制小数的方法
    什么是类、对象、方法、属性、类的成员
    asp.net代码中尖括号和百分号的含义
    打开某个AVI文件,explorer.exe遇到问题需要关闭的解决方法
    中国娱乐学习门户负责人吴晓林讲解项目
    系统流程图与业务流程图
    如何去掉Zblog的版权信息(powered by)
    利用教育游戏丰富与深化综合实践活动课程教与学的理论与实践研究 课题
    浅析C# 中object sender与EventArgs e(转)
  • 原文地址:https://www.cnblogs.com/qimang-311/p/15475372.html
Copyright © 2020-2023  润新知