Adapter 的使用
在Android里面经常会用到Adapter,例如列表。
Adapter主要是实现列表里面每一个列表项的数据填充。
Adapter主要有3种常用的实现类:ArrayAdapter,SimpleAdapter,BaseAdpter。
ArrayAdapter
根据名称可以大致知道这个Adapter的用途,通常用于数组或者List集合的多个值包装成多个列表项。
对应的列表项布局通常是TextView。
核心代码如下:
// 找到布局文件中对应的列表视图
ListView mListView = (ListView)FindViewById(R.id.listView);
// 定义一个数据数组
String[] arr = {"item1","item2","item3"};
// 生成一个ArrayAdapter
ArrayAdapter<String> mArrayAdapter = new ArrayAdapter<String>(this, R.layout.array_item, arr);
// 把ArrayAdapter装配到列表视图上
mListview.setAdapter(mArrayAdapter);
SimpleAdapter
SimpleAdapter从名字看是简单,但能实现的功能不简单,不要被他的名字欺骗了。下面我们来看看他能力。
这里设计一个有图标和文字的列表项(类似桌面图标),核心代码如下:
// 列表项中的文字和图标数据
String[] items_name = {"item1","item2","item3"};
int[] items_image = {R.drawable.sms, R.drawable.keep, R.drawable.dropbox};
// 生成一个集合对象,这里很重要!
List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
for(int i = 0; i < items_name.length; i++){
Map<String, Object> listItem = new HashMap<String, Object>();
listItem.put("image", items_image[i]);
listItem.put("name", items_name[i]);
listItems.add(listItem);
}
// 生成SimpleAdapter,把数据和列表项的ImageView,TextView对应起来
SimpleAdapter mSimpleAdapter = new SimpleAdapter(this, listItems, R.layout.main_grid_item, new String[]{"image","name"},new int[]{R.id.item_image, R.id.item_text});
// 找到列表视图
GridView mGridView = (GridView)findViewById(R.id.gridView);
// 装配SimpleAdapter
mGridView.setAdapter(mSimpleAdapter);
BaseAdapter
BaseAdapter 能取得Adapter的最大控制权,所以学会使用BaseAdapter就能把绝对多数效果都能实现了,是不是很吸引呢?
// mainActivity.java
String[] items_name = {"item1","item2","item3"};
int[] items_image = {R.drawable.sms, R.drawable.keep, R.drawable.dropbox};
ListView mListView = (ListView)FindViewById(R.id.listView);
MyAdapter myAdapter = new MyAdapter(this,items_name,items_image,R.layout.list_items);
mListView.setAdapter(myAdapter);
// MyAdapter.java
public class MyAdapter extends BaseAdapter {
private Context mContext;
private int mLayout;
private String[] name;
private int[] image;
private LayoutInflater mLayoutInflater;
public MyAdapter(Context context, String[] s, int[] i, int itemlayout){
mContext = context;
mLayout = itemlayout;
name = s;
image = i;
mLayoutInflater = LayoutInflater.from(context);
}
// 创建这个是为了提升效率,一次查找对应视图和保存对应的指针,每次操作只需要从中读取指针地址就能操作视图中的控件
public class ViewHolder{
public TextView name;
public ImageView image;
public ViewHolder(View view){
name = (TextView)view.findViewById(R.id.tv);
image = (ImageView)view.findViewById(R.id.iv);
}
}
// 返回position处的列表项的视图
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder mViewHolder;
View mView;
if (convertView == null) {
mView = mLayoutInflater.inflate(mLayout, null);
convertView = mView;
mViewHolder = new ViewHolder(mView);
convertView.setTag(mViewHolder);
} else {
mViewHolder = (ViewHolder)convertView.getTag();
}
mViewHolder.name.setText(name[position]);
mViewHolder.image.setImageResource(image[position]);
return convertView;
}
// 有多少个列表项,很重要
@Override
public int getCount() {
return name.length;
}
// 返回position处的列表项内容
@Override
public Object getItem(int position) {
return null;
}
// 返回position处的列表项ID
@Override
public long getItemId(int position) {
return position;
}
}