Android之BaseAdapter

本文深入解析Android中BaseAdapter的使用场景、步骤及抽象方法,详细介绍getView方法的两种优化方式,包括利用缓存convertView和ViewHolder模式,提升ListView性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、BaseAdapter简介及使用场景

BaseAdapter 是一个抽象类,常用于和 Android 中的一些控件如ListView,GridView,ExpandableListview,Spinner 等控件结合来显示数据的一种控件,在 Android 开发中占有很重要的位置


二、BaseAdapter 的使用步骤

BaseAdapter 是一个抽象类,在使用时:

①首先,定义一个类来继承该类;

②其次,实现里面对应的抽象方法,同时完成方法体的书写;

③最后,在相应的 Activity 中使用该适配器。

三、BaseAdapter 中抽象方法

public class AppListAdapter extends BaseAdapter{
                            
        @Override
        public int getCount() {
            return 0;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            return null;
        }
}

1、 需要重写的方法及作用:

①数据的大小

public int getCount()

②返回当前position位置的这一条数据

public Object getItem(int position)

③返回当前position位置的这一条数据的ID

public long getItemId(int position)

④处理view和data填充数据的一个过程

publiv View getView(final int position, View convertView, ViewGroup parent)

2、getView方法

①参数介绍

position:从0开始

convertView:是Spinner,ListView中每一项要显示的view

parent:父窗体,也就是Spinner,ListView,GridView了

通常return的view也就是convertView

②优化处理

第一种优化方法:

通过缓存convertView。这种利用缓存 contentView 的方式可以判断如果缓存中不存在 View 才创建 View,如果已经存在可以利用缓存中的 View,提升了性能

public View getView(final int position,View convertView,ViewGroup parent){
    if(convertView==null){
        LayoutInflater layoutInflater= (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView=layoutInflater.inflate(R.layout.item_app_list_view,null);
    }

    ImageView mAppIconImageView=(ImageView)convertView.findViewById(R.id.app_icon_image_view);
    TextView mAppNameTextView=(TextView)convertView.findViewById(R.id.app_name_text_view);

    mAppIconImageView.setDrawbleResource(R.drawble.ic_launcher);
    mAppNameTextView.setText("微信");

    return convertView;
}

第二种优化方法:

1、通过 convertView+ViewHolder 来实现,ViewHolder 就是一个静态类,使用 ViewHolder 的关键好处是缓存了显示数据

的视图(View),加快了 UI 的响应速度。

2、当我们判断 convertView == null 的时候,如果为空,就会根据设计好的 List 的 Item 布局(XML)来为 convertView 赋值,并生成一个 viewHolder 来绑定 converView 里面的各 个 View 控件(XML 布局里面的那些控件)。再用 convertView 的 setTag 将 viewHolder 设置到 Tag 中,以便 系统第二次绘制 ListView 时从 Tag 中取出。(看下面代码中)

3、如果 convertView 不为空的时候,就会直接用 convertView 的 getTag()来获得一个 ViewHolder。

/**
* 利用ViewHolder进行一个缓存
*/
public class ViewHolder{
   public ImageView mAppIconImageView;
   public TextView mAppNameTextView;


}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {

   ViewHolder viewHolder=new ViewHolder();

   if(convertView==null){
       //把XML文件读到Java中,变成一个View对象用于操作
       LayoutInflater layoutInflater= (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
       convertView=layoutInflater.inflate(R.layout.item_app_list_view,null);

       // 获取控件
       viewHolder.mAppIconImageView=(ImageView)convertView.findViewById(R.id.app_icon_image_view);
       viewHolder.mAppNameTextView=(TextView)convertView.findViewById(R.id.app_name_text_view);

       //让convertView和viewHolder之间有一个对应关系
       convertView.setTag(viewHolder);
   }
   else{
       viewHolder= (ViewHolder) convertView.getTag();
   }

   // 和数据之间进行绑定
   //获取应用的名称并与行布局 View 绑定
   viewHolder.mAppNameTextView.setText(mAppInfos.get(position).activityInfo.loadLabel(getPackageManager()));
   //获取应用的图标并与行布局 View 绑定
   viewHolder.mAppIconImageView.setImageDrawable(mAppInfos.get(position).activityInfo.loadIcon(getPackageManager()));

  

   return convertView;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值