android-继承BaseAdapter自定义适配器基础

本文介绍了自定义适配器的基础知识,包括如何集成BaseAdapter并实现关键方法,以及优化性能的方法,例如复用Item视图以减少内存消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我们开发的过程中,经常会用到列表listview跟gridview, GridView跟ListView都是比较常用的多控件布局,有时候我们需要操作列表中的控件或数据,最好的办法就是使用自定义适配器来实现这些需求。这篇文章主要讲解自定义的基本操作知识。
首先来看看 列表视图、初始数据、列表项布局关系图
这里写图片描述
上图可以理解为基础数据Arraylist设置给列表项布局book_item.xml,然后通过position将item视图添加到ListView中。
下面看看如何自定义适配器:
自定义适配器的适配器代码集成BaseAdapter

    private class BookAdapter extends BaseAdapter{
        //取得初始数据的长度
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return data==null?0:data.size();
        }
        //通过position取得数据Item项
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
             return data==null?null:data.get(position);
        }
        //通过position得到item项的行号
        @Override
        public long getItemId(int position) {
            return  data==null?0:Long.valueOf(data.get(position).get(ID).toString());
        }
        /**返回当前要显示的item视图
         * position: 当前要显示的item项的数据的位置(data的位置)
         * convertView:可回收的item项视图对象
         * parent:父控件
         */
        public View getView(int position, View convertView, ViewGroup parent) {
            //取得当前要显示的数据
            HashMap<String, Object> map=data.get(position);
            //先判断convertView是否为空
            if(convertView==null){
                convertView=getLayoutInflater().inflate(R.layout.book_item, parent, false);
            }
            TextView nameEdt=(TextView) convertView.findViewById(R.id.name);
            TextView priceEdt=(TextView) convertView.findViewById(R.id.price);
            //设置item项的控件的数据
            nameEdt.setText(map.get(NAME).toString());
            priceEdt.setText(map.get(PRICE).toString());
            //设置item项的控件的属性
            nameEdt.setTextColor(Color.RED);
            priceEdt.setTextColor(Color.BLUE);
            return convertView;
        }
    }

由于自定义适配器在加载item的过程中,会不断的创建列表视图,因此当某个item进入视野范围内时,就会调用adapter的getView方法,重新渲染item。之前我们在每次渲染item的时候都重新实例化item的布局文件,创建一个View,这样会产生很多的对象,性能不佳。
.我们尝试使用下面这种循环利用的方案
这里写图片描述

1> 假设我们的屏幕刚好只能放下3个item
2> 当从状态1—>状态2,有4个item同时出现在屏幕中,因此这4个ItemView都是不同的对象
3> 当从状态2—>状态3,item-0消失在视野中
4> 当从状态3—>状态4,我们可以考虑把之前的item-0移动到item-4的位置,因为item-0跟item-4不会同时出现在我们视野范围中
5> 当从状态4—>状态3,我们可以考虑把之前的item-4移动到item-0的位置
3. 再来看public View getView(int position, View convertView, ViewGroup parent)中的convertView参数,这个是系统帮我们传递进来的,它就代表当前可循环利用的ItemView
4. 注意:虽然性能有提升,但是在渲染item的时候,一定保证当前item要完全覆盖可循环利用item的数据,因为循环利用item可能会造成旧数据残留。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值