BaseAdapter的使用及优化-创新互联

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

成都创新互联公司专注于企业成都营销网站建设、网站重做改版、揭西网站定制设计、自适应品牌网站建设、HTML5建站电子商务商城网站建设、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为揭西等各大城市提供网站开发制作服务。

  在学习了多种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);

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章名称:BaseAdapter的使用及优化-创新互联
转载注明:http://myzitong.com/article/ccdhjc.html