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很复杂的时候也有不错的效率,因此推荐使用。

 

原文地址:https://www.cnblogs.com/studya/p/13061354.html