zoukankan      html  css  js  c++  java
  • Android——Adapter

    Adapter——本身只是一个接口。Adapter是将数据绑定到UI界面上的桥接类。Adapter负责创建显示每个项目的子View和提供对下层数据的访问。

    数据适配器作用:把复杂的数据(数组、链表、数据库、集合等)填充在指定视图界面上。

    数据适配器是连接数据源和视图界面的桥梁 

    介绍一下最常用的三个实现类:

    1、ArrayAdapter:简单易用,通常用于将数组或List集合的多个值包装成多个列表项。每个列表项只能是TextView。

    实现过程:新建适配器——添加数据源到适配器——视图加载适配器

    //定义一个数组
        String[] arr1 = {"aa","bb","cc"};
            //将数组包装为ArrayAdapter
            ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this,R.layout.array_item,arr1);
            //为ListView设置Adapter
            list.setAdapter(adapter1);//list为ListView组件

    创建ArrayAdapter时必须指定如下三个参数:

    Context:代表了访问整个Android应用的接口

    textViewResourceId:一个资源ID,该资源ID代表了一个TextView,该TextView组件将作为ArrayAdapter的列表项组件。(控制每个列表项组件)

    数组或List:该数组或List将负责为多少列表项提供数据。(为列表项提供数据)

    2、SimpleAdapter:功能强大,可用于将List集合的多个对象包装成多个列表项

    实现过程:新建适配器——添加数据源到适配器——视图加载适配器

    举个小例子:一个列表项包含:最左边为图标,接着同一行上边是标题,下面是一些说明文字。

    先定义了三个数组,分别存储上述三类。

        //创建一个List集合,List集合的元素是Map
    
        List<Map<String,Object>> listItems = new ArrayList<Map<String, Object>>();
        for(int i =0;i<names.length;i++){
            Map<String,Object> listItem = new HashMap<String,Object>();
            listItem.put("header",imageIds[i]);
            listItem.put("name",names[i]);
            listItem.put("desc",descs[i]);
            listItems.add(listItem);
        }
        //创建一个SimpleAdapter
        SimpleAdapter simpleAdapter = new SimpleAdapter(this,listItems,R.layout.simple_item,
                new String[]{"name","header","desc"},new int[]{R.id.name,R.id.header,R.id.desc});
        ListView list = (ListView) findViewById(R.id.mylist);
        list.setAdapter(simpleAdapter);

    五大参数解释:

    Context:上下文

    data:数据源。是一个List<? extends Map<String,?>>类型的集合对象,该集合中每个Map<String,?>对象生成一个列表项

    Resource:列表项的布局文件ID

    from:Map中的键名

    to:绑定数据视图中的ID,与from成对应关系

    3、BaseAdapter:通常用于被扩展。扩展BaseAdapter可以对各列表项进行最大限度的定制。

    BaseAdapter基本结构

    1)public int getCount():适配器中数据集中数据的个数

    2)public Object getItem(int position): 获取数据集中与指定索引对应的数据项

    3)public long getItemId(int position): 获取指定行对应的ID

    4)public View getView(int position, View convertView, ViewGroup parent): 获取每一个Item的显示内容。

    ViewHolder优化BaseAdapter思路:

    1)创建Bean对象,用于封装数据

    2)在构造方法中初始化用于映射的数据List

    3)创建ViewHolder类,创建布局映射关系

    4)判断convertView,为空则创建,并设置tag,否则通过tag来取出ViewHoldr。

    5)给ViewHolder中的控件设置数据

    详细代码(布局文件未给出):

    public class ItemBean {
    
        public int itemImageResid;
        public String itemTitle;
        public String itemContent;
    
        public ItemBean(int itemImageResid, String itemTitle, String itemContent) {
            this.itemImageResid = itemImageResid;
            this.itemTitle = itemTitle;
            this.itemContent = itemContent;
        }
    }
    public class MyAdapter extends BaseAdapter {
         private LayoutInflater mLayoutInflater;
        // 映射数据
        private List<ItemBean> mDataList;
        private long mSumTime;
        public MyAdapter(Context context, List<ItemBean> list) {
            mLayoutInflater = LayoutInflater.from(context);
            mDataList = list;
        }
       // 获取数据量
        @Override
        public int getCount() {
            return mDataList.size();
        }
        // 获取对应ID项对应的Item
        @Override
        public Object getItem(int position) {
            return mDataList.get(position);
        }
        // 获取对应项ID
        @Override
        public long getItemId(int position) {
            return position;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // 逗比式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
            // 获取纳秒时间 更加精确
            long start = System.nanoTime();
            // 由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null
            View view = mLayoutInflater.inflate(R.layout.item, null);
            // 实例化控件
            ImageView itemImage = (ImageView) view.findViewById(R.id.iv_image);
            TextView itemTitle = (TextView) view.findViewById(R.id.tv_title);
            TextView itemContent = (TextView) view.findViewById(R.id.tv_content);
            // 取出bean对象
            ItemBean bean = mDataList.get(position);
            // 设置控件的数据
            itemImage.setImageResource(bean.itemImageResid);
            itemTitle.setText(bean.itemTitle);
            itemContent.setText(bean.itemContent);
            long end = System.nanoTime();
            long dValue = end - start;
            mSumTime += dValue;
            // 输出每次getView消耗的时间和
            Log.d("xys", String.valueOf(mSumTime));
            return view;
            // 逗比式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>24409529
    
            // 普通式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
            // 获取纳秒时间 更加精确
    //        long start = System.nanoTime();
    //        if (convertView == null) {
            // 由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null
    //            convertView = mLayoutInflater.inflate(R.layout.item, null);
    //        }
    //        ImageView itemImage = (ImageView) convertView.findViewById(R.id.iv_image);
    //        TextView itemTitle = (TextView) convertView.findViewById(R.id.tv_title);
    //        TextView itemContent = (TextView) convertView.findViewById(R.id.tv_content);
    //        // 取出bean对象
    //        ItemBean bean = mDataList.get(position);
            // 设置控件的数据
    //        itemImage.setImageResource(bean.itemImageResid);
    //        itemTitle.setText(bean.itemTitle);
    //        itemContent.setText(bean.itemContent);
    //        long end = System.nanoTime();
    //        long dValue = end - start;
            // 输出每次getView消耗的时间和
    //        Log.d("xys", String.valueOf(mSumTime));
    //        return convertView;
            // 普通式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>19271161
            // 文艺式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
            // 获取纳秒时间 更加精确
    //        long start = System.nanoTime();
    //        ViewHolder holder = null;
    //        if (convertView == null) {
    //            holder = new ViewHolder();
            // 由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null
    //            convertView = mLayoutInflater.inflate(R.layout.item, null);
    //            holder.img = (ImageView) convertView.findViewById(R.id.iv_image);
    //            holder.title = (TextView) convertView.findViewById(R.id.tv_title);
    //            holder.content = (TextView) convertView.findViewById(R.id.tv_content);
    //            convertView.setTag(holder);
    //        } else {
    //            holder = (ViewHolder) convertView.getTag();
    //        }
            // 取出bean对象
    //        ItemBean bean = mDataList.get(position);
            // 设置控件的数据
    //        holder.img.setImageResource(bean.itemImageResid);
    //        holder.title.setText(bean.itemTitle);
    //        holder.content.setText(bean.itemContent);
    //        long end = System.nanoTime();
    //        long dValue = end - start;
    //        mSumTime += dValue;
            // 输出每次getView消耗的时间和
    //        Log.d("xys", String.valueOf(mSumTime));
    //        return convertView;
            // 文艺式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>16325820
        }
    
    
    
        // ViewHolder用于缓存控件
        class ViewHolder{
            public ImageView img;
            public TextView title;
            public TextView content;
        }
    }
  • 相关阅读:
    jQuery length 和 size()区别
    HTML5中Web Sql学后总结
    HTML5中的history API的理解和使用
    js中同步与异步的理解
    字符编码理解
    excel之VBA总结
    android29之UI控件的抽屉式实现方法之一(DrawerLayout和NavigationView)
    Linux环境下django初入
    Springboot整合MybatisPlus(超详细)完整教程~
    自定义持久层框架设计实现思路
  • 原文地址:https://www.cnblogs.com/jingmengxintang/p/5756971.html
Copyright © 2011-2022 走看看