Android 初识适配器(adapter)和ListView

本文介绍了Android编程中适配器(adapter)的概念,尤其是对象适配器的使用,它通过组合方式将类对象适配。文章以ListView为例,详细阐述了对象适配器如何提高性能,如在getView()方法中利用convertView缓存数据,减少布局加载,以及源码中AbsListView的obtainView过程。最后,总结了ListView与适配器结合的优化原理,揭示了Android架构设计的巧妙之处。

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

一、前言

最近初学android编程,在看到ListView的使用后,总是想不明白适配器(adapter)为什么会跟ListView在一起使用,这好像跟传统中的适配器(adpater)的作用不太像,适配器的主要作用是将不兼容的接口转换为兼容的接口。经过上网查资料和翻阅书籍资料后,发现其实适配器分为两种,传统的适配器称为类适配器,就是上面提到的那种。还有一种称为对象适配器,就是android里和ListView一起使用的适配器。

二、对象适配器

   对象适配器以组合的方式将两个类对象适配起来,并且不仅可以适配某个类,也可以适配该类的任何子类。下面看一段代码,会发现很熟悉。这是一个优化过的ListView代码的模板。

public class MyAdapter extends BaseAdapter{
    private LayoutInflater mInflate;
    List<String> mDatas;
    
    public MyDapter(Context context, List<String> datas){
        this.m
    }

    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
       ViewHolder holder = null;
       if(convertView ==null){
           holder = new ViewHolder();
           convertView = mInflater.inflate(android.R.layout.simple_list_item_1,null);
           holder.title = (TextView)convertView.findViewById(android.R.id.text1);
           convertView.setTag(holder);
       }else{
           holder = (ViewHolder)convertView.getTag();
       }
       holder.title.setText(mDatas.get(position));
       return  convertView;
    }

    class ViewHolder{
        TextView title;
    }
}

在getView中,要是有一个item滑出界面,就会被认为是"废弃"的,就会加到RecycleBin中,convertView就会生成一个View对象,里面保存着“废弃”Item的数据,就不需要加载布局,再利用setTag将控件ID也缓存下来,下次进getView函数的时候,可以直接getTag获取缓存的控件ID,从而优化了性能。在android源码中的AbsListView.java中的obtainView中的实现可以看到convertView是怎么产生的。

 View obtainView(int position, boolean[] isScrap) {
        Trace.traceBegin(Trace.TRACE_TAG_VIEW, "obtainView");

        isScrap[0] = false;
        View scrapView;

        scrapView = mRecycler.getTransientStateView(position);
        if (scrapView == null) {
            scrapView = mRecycler.getScrapView(position);
        }

        View child;
        if (scrapView != null) {
            child = mAdapter.getView(position, scrapView, this);

            ///......
            } else {
               ///.....
            }
        } else {
            child = mAdapter.getView(position, null, this);

           ///...
        }
        return child;
    }

在mRecyler.getScrapView中尝试获取RecycleBin中是否有"废弃",有的话就将scrapView传入mAdapter.getView中,没有的话,传入一个null。

3、总结

这里可以看到ListView和适配器的使用,是一个经典的对象适配器的使用例子,也看到了ListeView优化背后的原理,初始android架构设计的高明之处。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值