AdapterView

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();
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值