温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

BaseAdapter的使用及优化

发布时间:2020-07-19 19:43:35 来源:网络 阅读:416 作者:许大虫 栏目:开发技术

    ListView在安卓开发中,是经常需用使用的控件,而用这个控件,就离不开它的数据绑定,这时候Adapter(数据适配器)就起了很大作用     

    在学习了多种Adapter(适配器之后),感觉比较常用的三种就是ArrayAdapter和SimpleAdapter以及BaseAdapter.

    ArrayAdapter用法最为简单,但功能较为单一,一般只能显示简单的文本信息。

    SimpleAdapter有所提升,能通过自己编写一个布局来显示图像和文本,但缺点在于模板单一,只能使用固定的1个模板

    而BaseAdapter(基础适配器)则最为自由,可以通过重写方法来实现自己想要的各种的布局,但是难度较大,接下来将浅谈一下自己对BaseAdapter的使用及优化方法。

  1. 要使用BaseAdapter,先写一个class类继承BaseAdapter,并实现其方法,方法如下BaseAdapter的使用及优化

  2. getCount()为获取数据条目的数量,返回值也就是数据条目的数量(这个返回值数据条目的数量一定要写)、getItem()为获取对应ID项对应的Item(可以不用管)、getItemId()为获取对应项ID(也可以不用管),最后一个方法最为重要也就是getView(int position,View covertView,ViewGroup arg2),重写的主要是这个方法

  3. 事先准备如下BaseAdapter的使用及优化其中context为上下文,List<...>集合可以根据自己需要用泛型来规定自己的数据,这里只是简单例子

  4. 接下来就开始重写getView(...)方法,步骤主要分为:BaseAdapter的使用及优化

  5. 第一种写法:

          // 获取纳秒时间 更加精确

            long start = System.nanoTime();

      // 由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null

           LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View view = inflater.inflate(R.layout.item, null);

            // 实例化控件(这些控件为自己在根据需要在布局中加的控件)

            ImageView itemImage = (ImageView) view.findViewById(R.id.iv_p_w_picpath);

            TextView itemTitle = (TextView) view.findViewById(R.id.tv_title);

            TextView itemContent = (TextView) view.findViewById(R.id.tv_content);

            // 取出contact对象

            Contact contact = contacts.get(position);

            // 设置控件的数据

            itemImage.setImageResource(contact.itemImageResid);

            itemTitle.setText(contact.itemTitle);

            itemContent.setText(contact.itemContent);

            //记录时间

            long end = System.nanoTime();

            long dValue = end - start;

            mSumTime += dValue;

            // 输出每次getView消耗的时间和

            Log.d("ATG", String.valueOf(mSumTime));

            return view;

    这种方法最基础,也最耗时,原因是函数没被调用一次,所有步骤都要执行一次,实际上有些步骤或控件是可以重用的。

  6. 第二种改良方法:

    // 获取纳秒时间 更加精确

    //        long start = System.nanoTime();

    //        当第一次调用该方法是,才需要将布局模块转为View对象,其它时候不需要了

    //        if (convertView == null) {

    //           LayoutInflater inflater = LayoutInflater.from(context);

    //          convertView = inflater.inflate(R.layout.item, null);

    //        }

    //        ImageView itemImage = (ImageView) convertView.findViewById(R.id.iv_p_w_picpath);

    //        TextView itemTitle = (TextView) convertView.findViewById(R.id.tv_title);

    //        TextView itemContent = (TextView) convertView.findViewById(R.id.tv_content);

    //        // 取出contact对象

    //        Contact contact = contacts.get(position);

    // 设置控件的数据

    //        itemImage.setImageResource(contact.itemImageResid);

    //        itemTitle.setText(contact.itemTitle);

    //        itemContent.setText(contact.itemContent);

    //        long end = System.nanoTime();

    //        long dValue = end - start;

    //        mSumTime += dValue;

    // 输出每次getView消耗的时间和

    //        Log.d("ATG", String.valueOf(mSumTime));

    //        return convertView;

        这种方法将无谓的重复的吧布局模块转为View对象的步骤简化

  7. 第三种方法:

    // 获取纳秒时间 更加精确

    //        long start = System.nanoTime();

    //        ViewHolder holder = null;

    //        if (convertView == null) {

    //            holder = new ViewHolder();

    //            LayoutInflater inflater = LayoutInflater.from(context);

    //            convertView = inflater.inflate(R.layout.item, null);

    //            holder.img = (ImageView) convertView.findViewById(R.id.iv_p_w_picpath);

    //            holder.title = (TextView) convertView.findViewById(R.id.tv_title);

    //            holder.content = (TextView) convertView.findViewById(R.id.tv_content);

    //            convertView.setTag(holder);

    //        } else {

    //            holder = (ViewHolder) convertView.getTag();

    //        }

    // 取出contact对象

    //        Contact contact = contacts.get(position);

    // 设置控件的数据

    //        holder.img.setImageResource(contact.itemImageResid);

    //        holder.title.setText(contact.itemTitle);

    //        holder.content.setText(contact.itemContent);

    //        long end = System.nanoTime();

    //        long dValue = end - start;

    //        mSumTime += dValue;

    // 输出每次getView消耗的时间和

    //        Log.d("ATG", String.valueOf(mSumTime));

    //        return convertView;

        }

        // ViewHolder用于缓存控件

        class ViewHolder{

            public ImageView img;

            public TextView title;

            public TextView content;

        }

    这种方法将初始化控件也设置在了只在第一次调用时使用,这用就避免了多次寻找控件初始化的操作,这种方法是这三种方法中优化效果最好,也最推荐使用,因为当运行程序较大时,每一步的优化都尤为关键。

  8. 然后就是创建适配器ContactAdapter contactadapter = new ContactAdapter(this, contacts);

  9. 最后就是将ListView控件加载到适配器中listView.setAdapter(contactadapter);

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI