zoukankan      html  css  js  c++  java
  • BaseAdapter的使用

    我们知道,数据源是各种各样的,而ListView所展示数据的格式则是有一定的要求的。数据适配器正是建立了数据源与ListView之间的适配关系,将数据源转换为ListView能够显示的数据格式,从而将数据的来源与数据的显示进行解耦,降低程序的耦合性。这也体现了Android的适配器模式的使用。对于ListView、GridView等数据展示控件有多种数据适配器,本文讲解最通用的数据适配器——BaseAdapter。

    BaseAdapter

    使用BaseAdapter比较简单,主要是通过继承此类来实现BaseAdapter的四个方法:

    public int getCount(): 适配器中数据集的数据个数;

    public Object getItem(int position): 获取数据集中与索引对应的数据项;

    public long getItemId(int position): 获取指定行对应的ID;

    public View getView(int position,View convertView,ViewGroup parent): 获取没一行Item的显示内容。

    前三种方法比价简单,getview()比较复杂,下面说一下,一般有三种方法:

    第一种(没有利用到优化机制,效率很低,不推荐使用):

    public View getView(int position, View convertView, ViewGroup parent) {
            View view=minflater.inflate(R.layout.item,null);
            ImageView imageView=(ImageView) view.findViewById(R.id.image);
            TextView title=(TextView) view.findViewById(R.id.title);
            TextView content=(TextView) view.findViewById(R.id.content);
            ItemBean bean=mlist.get(position);
            imageView.setImageResource(bean.imageid);
            title.setText(bean.title);
            content.setText(bean.content);
            return view;
    }

    这种方式每次调用getView时都是通过inflate创建一个新的View对象,然后在此view中通过findViewById找到对应的控件。、

    第二种(优化版):

    public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.item,null);
            }//找到item布局文件中对应的控件
    
            ImageView imageView = (ImageView) convertView.findViewById(R.id.image);
            TextView titleTextView = (TextView) convertView.findViewById(R.id.title);
            TextView contentTextView = (TextView) convertView.findViewById(R.id.content);
         //获取相应索引的ItemBean对象

    ItemBean bean = mList.get(position); // 设置控件的对应属性值 imageView.setImageResource(bean.itemImageResId); titleTextView.setText(bean.itemTitle); contentTextView.setText(bean.itemContent); return convertView; }

    这种方式利用了ListView的缓存机制,但是在ListView很复杂是,需要的时间仍然很多。

    第三中(优优化版):

    //文艺式
            /*利用ViewHolder优化BaseAdapter思路:
            1.创建Bean对象,用于封装数据
            2.在构造方法中初始化用于映射的数据List
            3.创建ViewHolder类,创建布局映射关系
            4.判断convertView,为空则创建,并设置tag;否则通过tag来取出viewholder
            5.给viewholder中的空间设置数据*/
    
            ViewHolder viewHolder;
            if(convertView==null){
                convertView=minflater.inflate(R.layout.item,null);
                viewHolder=new ViewHolder();
                viewHolder.imageView=(ImageView)convertView.findViewById(R.id.image);
                viewHolder.title=(TextView)convertView.findViewById(R.id.title);
                viewHolder.content=(TextView)convertView.findViewById(R.id.content);
                convertView.setTag(viewHolder);
            }else{
                viewHolder=(ViewHolder) convertView.getTag();
            }
            ItemBean bean=mlist.get(position);
            viewHolder.imageView.setImageResource(bean.imageid);
            viewHolder.title.setText(bean.title);
            viewHolder.content.setText(bean.content);
            return convertView;
        }
        class ViewHolder{
            public ImageView imageView;
            public TextView title;
            public TextView content;
        }

    这种方法尽量避免了,findview()的使用,因此哪怕在Listview很复杂的时候也有不错的效率,因此推荐使用。

     

  • 相关阅读:
    Linux进阶之bond链路聚合
    Linux服务之cobbler批量部署篇
    Linux进阶之排错
    shell基础之综合练习
    shell基础之99乘法表
    Linux进阶之VMware Linux虚拟机运行提示“锁定文件失败 虚拟机开启模块snapshot失败”的解决办法
    Linux服务之DNS服务篇
    linux服务之NTP及chrony时间同步
    八大排序算法汇总
    堆排序
  • 原文地址:https://www.cnblogs.com/studya/p/13061354.html
Copyright © 2011-2022 走看看