BaseAdapter(数据适配器)的使用与优化
BaseAdapter
把各种各样的数据源与具有格式要求的 ListView 相联系,将数据源转换成 ListView 可以显示的格式,降低程序的耦合性,使得程序方便扩展。
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显示的内容
BaseAdapter的三重境界(来自慕课网)
- 逗比式
没有利用 ListView 的缓存机制,findViewById() 多次使用造成资源的浪费 - 普通式
充分利用了 ListView 的缓存机制 - 文艺式
使用 ViewHolder 避免了重复使用 findViewById() 造成的资源浪费,提高运行速度
BaseAdapter的使用与优化
MainActivity.java
public class MainActivity extends AppCompatActivity {
private List<ItemBean>itemBeanList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化数据源
itemBeanList = new ArrayList<>();
for(int i = 0;i < 20 ;i++)
{
itemBeanList.add(new ItemBean(
R.mipmap.ic_launcher,
"我是标题" + i,
"我是内容" + i
));
}
ListView listView = (ListView) findViewById(R.id.listV);
//给 listView 绑定适配器
listView.setAdapter(new MyAdapter(this,itemBeanList));
}
}
自定义 ListView 条目项内容
ItemBean.java
public class ItemBean {
public int ItemImageId;
public String ItemTitle;
public String ItemContent;
//使用构造函数设置相应成员变量的值
ItemBean(int ImageId , String Title , String Content){
this.ItemImageId = ImageId;
this.ItemTitle = Title;
this.ItemContent = Content;
}
}
条目项布局设置
Item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv_image"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@mipmap/ic_launcher"/>
<TextView
android:id="@+id/tv_title"
android:layout_toEndOf="@+id/iv_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/iv_image"
android:text="Title"
android:textSize="25sp"
android:gravity="center"/>
<TextView
android:id="@+id/tv_content"
android:layout_toRightOf="@+id/iv_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_title"
android:text="content"
android:textSize="15sp"
android:gravity="center_vertical" />
</RelativeLayout>
自定义Adapter
MyAdapter.java
public class MyAdapter extends BaseAdapter{
private List<ItemBean> mList;
private LayoutInflater mInflater;
public MyAdapter(Context context,List<ItemBean> list){ //使用Context对象初始化LayoutInflater对象
this.mList = list;
this.mInflater = LayoutInflater.from(context); //context要是用当前的Adapter的界面对象mInflater布局装载器对象
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//BaseAdapter的三重境界之逗比式-------------------------------------------------------------------------
/*
* 没有任何优化处理,每次都创建新的View,设置控件
*/
// View view = mInflater.inflate(R.layout.item,null); //mInflater.inflate([需要装在到的布局对象],null)
// ImageView imageView = (ImageView) view.findViewById(R.id.iv_image);
// TextView tv_title = (TextView) view.findViewById(R.id.tv_title);
// TextView tv_content = (TextView) view.findViewById(R.id.tv_content);
// ItemBean bean = mList.get(position); //定义ItemBean对象
// imageView.setImageResource(bean.ItemImageId); //设置ListView一个条目的内容
// tv_title.setText(bean.ItemTitle);
// tv_content.setText(bean.ItemContent);
// return view;
//END逗比式---------------------------------------------------------------------------------------
//BaseAdapter的三重境界之普通式======================================================================
//利用的ListView的缓存特性,没有缓存才创建新的View
//判断 convertView 是否已加载
// if(convertView == null) //为空,未被实例化,缓冲池中无缓存
// {
// convertView = mInflater.inflate(R.layout.item,null);
// }
// ImageView imageView = (ImageView) convertView.findViewById(R.id.iv_image);
// TextView tv_title = (TextView) convertView.findViewById(R.id.tv_title);
// TextView tv_content = (TextView) convertView.findViewById(R.id.tv_content);
// ItemBean bean = mList.get(position);
// imageView.setImageResource(bean.ItemImageId);
// tv_title.setText(bean.ItemTitle);
// tv_content.setText(bean.ItemContent);
// return convertView;
//END普通式========================================================================================
//BaseAdapter的三重境界之文艺式***********************************************************************
//创建内部类ViewHolder
ViewHolder viewHolder;
if(convertView == null)
{
viewHolder = new ViewHolder();
convertView = mInflater.inflate(R.layout.item,null);
viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv_image);
viewHolder.tv_titile = (TextView) convertView.findViewById(R.id.tv_title);
viewHolder.tv_content = (TextView) convertView.findViewById(R.id.tv_content);
convertView.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder) convertView.getTag();
}
ItemBean bean = mList.get(position);
viewHolder.imageView.setImageResource(bean.ItemImageId);
viewHolder.tv_titile.setText(bean.ItemTitle);
viewHolder.tv_content.setText(bean.ItemContent);
return convertView;
//END文艺式*****************************************************************************************
}
class ViewHolder{
public ImageView imageView;
public TextView tv_titile;
public TextView tv_content;
}
}