一、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;
}