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中显示内容
吐司提示
Toast 是 Android 中的应用提示,可以显示一段时间然后自动消失,不影响用户操作
//数据
private String [] ary = {"发福蝶","大鸡居","小乌堆","小海疼","丹鼎货","小凶许"};
@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);
自定义适配器
1、数据源的类型封装
public class User{
//头像
private int icon;
// 昵称
private String nick;
// 签名
private String sign;
...
}
2、每个Item的布局效果:
<?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);
// 加载每个 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;
}