三种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;
}

齐芒行,川锋明!
原文地址:https://www.cnblogs.com/qimang-311/p/15475372.html