AdapterView
指使用适配器来配置多个内容显示的视图,代表的有ListView(列表)、GridView(九宫格)、ExpanableListView(分组列表)
ListView
<ListView
android:id="@+id/m_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="#55666666"
android:dividerHeight="5dp" >
</ListView>
android:divider="#55666666" 分割线的资源,可以是颜色或者是图片(@drawable/xxx)
android:dividerHeight="5dp" 分割线的高度,处理两个item上下间距
java 中显示内容
//数据
private String[] ary = {"阿里巴巴", "京东", "网易", "腾讯", "华为", "百度", "新浪" };
ListView mListView = (ListView) findViewById(R.id.m_list);
// 适配器
//第一个参数是一个Context对象,第二个参数表示每个item的显示布局,第三个参数表示数据源
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, ary);
//设置适配器
mListView.setAdapter(adapter);
Item监听
//item点击监听
private OnItemClickListener mOnItemClick = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View itemView,
int position, long id) {
Log.e("m_tag", "点击了:" + ary[position]);
// 吐司提示
//Context对象,提示内容,提示时间(长或者短时间的选择)
Toast.makeText(MainActivity.this, "点击了:" + ary[position],
Toast.LENGTH_SHORT).show();
}
};
//item长按监听
private OnItemLongClickListener mOnItemLongClick = new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View itemView,
int position, long id) {
Log.e("m_tag", "长按了:" + ary[position]);
return true;
}
};
使用监听
// 设置item点击监听
mListView.setOnItemClickListener(mOnItemClick);
//设置item长按监听
mListView.setOnItemLongClickListener(mOnItemLongClick);
吐司提示
Toast是Android中的应用提示,可以显示一段时间然后自动消失,不影响用户操作
// 吐司提示
//Context对象,提示内容,提示时间(长或者短时间的选择)
Toast.makeText(MainActivity.this, "点击了:" + ary[position],Toast.LENGTH_SHORT).show();
自定义适配器
1、数据源的类型封装
public class User {
//头像
private int icon;
//昵称
private String nick;
//签名
private String sign;
...
}
2、每个item的布局效果(如:itemuserlayout.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/item_icon"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/pic0" />
<TextView
android:id="@+id/item_nick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/item_icon"
android:text="ABC"
android:textSize="20sp"
android:layout_marginLeft="5dp" />
<TextView
android:id="@+id/item_sign"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/item_icon"
android:layout_alignLeft="@id/item_nick"
android:maxLines="3"/>
</RelativeLayout>
3、定义类继承BaseAdapter,重写getCount、getItem、getItemId、getView
public class UserAdapter extends BaseAdapter {
private List<User> list;
// 布局加载器:可以将xml布局转为View对象
private LayoutInflater mInflater;
public UserAdapter(Context context, List<User> list) {
this.list = list;
// 初始化布局加载器
mInflater = LayoutInflater.from(context);
}
// 配置显示总条数
@Override
public int getCount() {
return null == list ? 0 : list.size();
}
// 按照位置获取数据对象
@Override
public Object getItem(int position) {
return list.get(position);
}
// 根据位置获取item的id
@Override
public long getItemId(int position) {
return position;
}
// 每个item的显示效果
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 加载每个item的布局对象(完成了item_user_layout.xml文件转为RelativeLayout对象)
View layout = mInflater.inflate(R.layout.item_user_layout, null);
//初始化布局中的元素
ImageView ivIcon = (ImageView) layout.findViewById(R.id.item_icon);
TextView tvNick = (TextView) layout.findViewById(R.id.item_nick);
TextView tvSign = (TextView) layout.findViewById(R.id.item_sign);
//获取数据显示内容(数据绑定,将数据显示到布局中)
User u = list.get(position);
ivIcon.setImageResource(u.getIcon());
tvNick.setText(u.getNick());
tvSign.setText(u.getSign());
return layout;
}
}
4、使用
ListView userList = (ListView) findViewById(R.id.user_list);
//初始化数据
List<User> list = new ArrayList<User>(7);
...
//创建适配器
UserAdapter adapter = new UserAdapter(this, list);
userList.setAdapter(adapter);
适配器缓存
针对每个item的显示都需要通过getView来获取一个View对象,然后如果每次getView时都需要单独new的话会浪费资源,因此需要借助getView方法中的
convertView来提升性能,convertView表示的是之前的item显示时使用的View对象,但是那个item已经不可见了,因此可以直接使用convertView来显示新内
容即可
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView iv;
if (convertView == null) {
iv = new ImageView(context);
// 创建布局参数设置宽高
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
AbsListView.LayoutParams.MATCH_PARENT, 300);
iv.setLayoutParams(lp);
} else {
iv = (ImageView) convertView;
}
iv.setImageResource(resIds[position]);
return iv;
}
针对item布局中多个元素的情况,可以自己定义类关联数据的显示
class ViewHolder {
ImageView ivIcon;
TextView tvNick;
TextView tvSign;
}
getView处理方式
public View getView(int position, View convertView, ViewGroup parent) {
Log.e("m_tag", "显示:" + position);
ViewHolder holder;
if (null == convertView) {
Log.e("m_tag", "加载布局:" + position);
// 先new RelativeLayout,new ImageView,添加到RelativeLayout下,new
// TextView添加到RelativeLayout,new TextView 添加到RelativeLayout
// 加载每个item的布局对象(完成了item_user_layout.xml文件转为RelativeLayout对象)
convertView = mInflater.inflate(R.layout.item_user_layout, null);
holder = new ViewHolder();
// 初始化布局中的元素
holder.ivIcon = (ImageView) convertView.findViewById(R.id.item_icon);
holder.tvNick = (TextView) convertView.findViewById(R.id.item_nick);
holder.tvSign = (TextView) convertView.findViewById(R.id.item_sign);
//设置标记(将已经初始化的视图保存起来,下次直接取出来显示即可)
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
// 获取数据显示内容(数据绑定,将数据显示到布局中)
User u = list.get(position);
holder.ivIcon.setImageResource(u.getIcon());
holder.tvNick.setText(u.getNick());
holder.tvSign.setText(u.getSign());
return convertView;
}
适配器的刷新
当适配器中的数据源发生变化时,可以使用适配器刷新方法更新界面显示
//将会导致适配的getCount以及可见区域内的元素都会重新getView
adapter.notifyDataSetChanged();