Android基础篇(四)

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

猜你喜欢

转载自blog.csdn.net/weixin_42097095/article/details/80615936