首页 > 其他分享 >Android开发 - (适配器)Adapter类中ArrayAdapter实现类详细解析

Android开发 - (适配器)Adapter类中ArrayAdapter实现类详细解析

时间:2024-07-31 11:51:44浏览次数:15  
标签:item ArrayAdapter 适配器 视图 Item adapter Adapter

作用

  • 数组数据映射到 UI 组件(如 ListView、Spinner 等)上的角色。它是 BaseAdapter 的一个子类,专门用于处理简单的数据集合,如数组列表ArrayAdapter 简化了数据到视图映射的过程,使得开发者能够以更少的代码实现数据的展示。它的主要作用为以下几点:
    • 数据绑定:它能够将一组数据(如字符串数组、整数数组或任何对象的数组)绑定到列表视图(ListView)下拉列表(Spinner)等组件上。这意味着你可以通过更改适配器中的数据来更新 UI 组件的显示内容
    • 视图管理ArrayAdapter 负责为每个数据项创建重用视图(View)。当列表项需要显示时,适配器会从已经存在的视图池中查找可重用的视图,如果找不到,则使用提供的布局资源来创建新的视图。这样做可以提高列表的滚动性能,因为创建和销毁视图是昂贵的操作
    • 数据更新:当数据集合发生变化时(例如,添加、删除或修改数据项),你可以通知适配器(通过调用 notifyDataSetChanged() 方法),然后适配器会更新与之关联的 UI 组件,以反映这些更改。
    • 类型安全:虽然 ArrayAdapter 可以处理任何类型的对象数组,但最好使用泛型版本的 ArrayAdapter<T> 来确保类型安全。这有助于避免在编译时期出现类型相关的错误
    • 自定义视图:你可以通过提供自定义的布局资源来定义每个列表项的外观。这个布局资源应该包含一个或多个视图(如 TextView、ImageView 等),并且你需要指定哪个视图应该用于显示数据。
    • 简单性和易用性:对于简单的数据列表,ArrayAdapter 提供了一种快速且简单的方法来将它们显示在 UI 上,而无需编写大量的适配器代码。这使得开发者能够更专注于应用程序的其他方面。

参数、方法解析

  • ArrayAdapter(Context context, int resource, T[] objects):基本构造方法;这个构造方法适用于当你有一个数组,并且想要将其内容展示在列表视图中时使用

    String[] items = {"Item 1", "Item 2", "Item 3", "Item 4", "Item 5"};
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, mList);
    
    • 参数解析
      • context上下文对象,通常为ActivityFragment的上下文
      • resource:表示每个数据项的布局资源文件ID,例如android.R.layout.simple_list_item_1
      • objects:一个数组,包含要适配到视图中的数据
  • ArrayAdapter(Context context, int resource, List<T> objects)List构造方法;这个构造方法允许你使用一个 List 集合来初始化适配器,这在数据可能发生变化时非常有用,因为你可以直接修改 List 集合来更新视图

    List<Fragment> mList = new ArrayList<Fragment>();
    mList.add("Item 1");
    mList.add("Item 2");
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, mList);
    
    • 参数解析
      • context上下文对象,通常为ActivityFragment的上下文
      • resource:表示每个数据项的布局资源文件ID,例如android.R.layout.simple_list_item_1
      • objects:一个 List 集合,包含要适配到视图中的数据
  • ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects):带有布局TextView ID 的基本构造方法;这个构造方法提供了更高的灵活性,允许你使用数组初始化适配器后指定数据应该被填充到布局中的哪个具体的 TextView 控件

    String[] items = {"Item 1", "Item 2", "Item 3", "Item 4", "Item 5"};
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, R.id.textView_1, mList);
    
    • 参数解析
      • context上下文对象,通常为ActivityFragment的上下文
      • resource:表示每个数据项的布局资源文件ID,例如android.R.layout.simple_list_item_1
      • textViewResourceId:在 resource 指定的布局文件中,用于显示数据的 TextViewID。这个参数允许你指定数据应该被填充到布局中的哪个 TextView 控件中;例如R.id.textView_1
      • objects:一个数组,包含要适配到视图中的数据。
  • ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects):带有布局TextView IDList构造方法;这个构造方法提供了更高的灵活性,允许你使用List 集合初始化适配器后指定数据应该被填充到布局中的哪个具体的 TextView 控件

    List<Fragment> mList = new ArrayList<Fragment>();
    mList.add("Item 1");
    mList.add("Item 2");
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, R.id.textView_1, mList);
    
    • 参数解析
      • context上下文对象,通常为ActivityFragment的上下文
      • resource:表示每个数据项的布局资源文件ID,例如android.R.layout.simple_list_item_1
      • textViewResourceId:在 resource 指定的布局文件中,用于显示数据的 TextViewID。这个参数允许你指定数据应该被填充到布局中的哪个 TextView 控件中;例如R.id.textView_1
      • objects:一个 List 集合,包含要适配到视图中的数据
  • adapter.add(T object);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1);
    adapter.add("Item 1");
    
    • 参数解析
      • object:向适配器中添加一个数据项
  • adapter.addAll(Collection<? extends T> collection);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1);
    List<String> dataList = new ArrayList<String>();
    dataList.add("Item 1");
    dataList.add("Item 2");
    adapter.addAll(dataList);
    
    • 参数解析
      • collection:向适配器中添加一个集合的数据项
  • adapter.clear();:清空适配器中的所有数据项

  • int count = adapter.getCount();:获取适配器中数据项的数量

  • String item = adapter.getItem(int position);

    • 参数解析
      • position:获取指定位置的数据项
  • View view = adapter.getView(int position, View convertView, ViewGroup parent)获取数据项的视图,用于在ListViewSpinner中显示数据。这个方法通常不需要直接调用而是由系统在需要显示列表项时自动调用

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1);
    View view = adapter.getView(position, null, listView);
    
    • 参数解析

      • position:要获取视图的数据项的位置(索引)

      • convertView:可复用的视图对象,用于优化列表性能,如果为null,表示要获取一个新的视图对象;如果不为null,则可以重复使用该视图对象,避免重复创建

      • parent:父视图,即该视图将被添加到的父容器(例如ListView)

  • adapter.notifyDataSetChanged();:当数据发生变化时,可以通过适配器的方法进行更新,然后通知列表重新显示更新后的数据

    adapter.add("New Item");
    adapter.notifyDataSetChanged();
    

代码实例

  • 创建自定义类,例如:Item.java,它包含了列表项的文本图标资源 ID

    public class Item {
        private String text;	//文本
        private int iconResId;	//视图资源Id
    
        public Item(String text, int iconResId) {
            this.text = text;
            this.iconResId = iconResId;
        }
    
        public String getText() {
            return text;
        }
    
        public int getIconResId() {
            return iconResId;
        }
    }
    
  • 启动类中实操如下:准备一个包含 Item 对象的数据集合作为数据源

    List<Item> itemList = new ArrayList<Item>();	//创建自定义类'Item'的 ArrayList 类(纯文本列表可以省略)
    //定义数据源
    itemList.add(new Item("Apple", R.drawable.apple));	
    itemList.add(new Item("Banana", R.drawable.banana));
    itemList.add(new Item("Cherry", R.drawable.cherry));
    itemList.add(new Item("Date", R.drawable.date));
    itemList.add(new Item("Grape", R.drawable.grape));
    //纯文本列表:itemList.add("Grape");
    
  • 创建一个自定义的 ArrayAdapter 实例,用来管理 Item 对象的数据集合:

    ArrayAdapter<Item> adapter = new ArrayAdapter<Item>(
            this,
            R.layout.item_listview, // 自定义的列表项布局文件,它包含一个 ImageView 和一个 TextView 用于显示 Item 对象的文本和图标(纯文本列表可以省略 ImageView 布局)
            itemList) {
        
        //在 ArrayAdapter 的匿名子类中重写了 getView 方法,以便自定义每个列表项的显示内容(纯文本列表可以省略,它会自动调用)
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // 重写getView方法以便自定义显示列表项
            if (convertView == null) {	//null,表示要获取一个新的视图对象
                convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_listview, parent, false);
            }
    
            ImageView iconImageView = convertView.findViewById(R.id.iconImageView);
            TextView textView = convertView.findViewById(R.id.textView);
    
            Item item = getItem(position);
    
            if (item != null) {	//不为null,则可以重复使用该视图对象,避免重复创建
                iconImageView.setImageResource(item.getIconResId());
                textView.setText(item.getText());
            }
    
            return convertView;
        }
    };
    
  • 创建一个自定义的列表项布局文件 item_listview.xml,用来显示每个 Item 对象的文本和图标:在布局文件中,我们使用了一个 ImageView 来显示图标,一个 TextView 来显示文本内容(纯文本列表可以省略 ImageView 布局

    <!-- item_listview.xml -->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp">
    
        <ImageView
            android:id="@+id/iconImageView"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:layout_marginEnd="16dp"
            android:src="@drawable/ic_launcher_foreground" />
    
        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18sp"
            android:text="Item Text" />
    
    </LinearLayout>
    
  • 将创建的适配器绑定到 ListView 控件上

    ListView listView = findViewById(R.id.listView);
    listView.setAdapter(adapter);
    
  • 通过以上步骤,我们创建了一个带有自定义视图ArrayAdapter,它显示了每个 Item 对象的文本和图标。当 ListView 显示时,ArrayAdapter 将根据数据源中的 Item 对象动态创建或重用视图,并将相应的文本和图标显示在列表项中

标签:item,ArrayAdapter,适配器,视图,Item,adapter,Adapter
From: https://www.cnblogs.com/ajunjava/p/18334316

相关文章

  • 设计模式:代理、装饰和适配器模式的区别
    结构对比讲实话,博主当初学习完整设计模式时,这三种设计模式单独摘哪一种都是十分清晰和明确的,但是随着模式种类的增加,在实际使用的时候竟然会出现恍惚,例如读开源代码时,遇到不以模式命名规范的代码时,一时难以说清具体是使用的这三种里的哪一种。之所以会出现混淆的原因是,三种模式......
  • ComfyUI插件:IPAdapter_plus(新版)节点
    ComfyUI插件:IPAdapter_plus(新版)节点前言:学习ComfyUI是一场持久战,而IPAdapter_plus是常用且便捷有效的风格迁移模型,可以通过提供参考图像去进行图像的生成,比如风格迁移,风格融合,人物脸部模拟等各种工作,请大家重点关注本篇内容,深刻理解节点用法!!祝大家学习顺利,早日成为ComfyUI的高手......
  • 设计模式总结:适配器、桥接、组合和迭代器模式
    在之前的对话中,我们讨论了五种常见的Java设计模式:单例、工厂、策略、装饰器和观察者模式。现在,让我们继续探索其他四种设计模式:适配器、桥接、组合和迭代器模式。适配器模式概念:适配器模式是一种结构型设计模式,用于将一个类的接口转换为另一个类期望的接口。适配器模式......
  • oss模块设计之适配器模式改造minio
    在进行本节的笔记之前,我们先进行对oss服务与minio做一个简单介绍,方便大家更便于理解;OSS服务(ObjectStorageService)OSS服务,即对象存储服务,是一种用于云端的大规模、高可用、安全、低成本的数据存储服务。它主要用于存储非结构化的数据,如图片、音频、视频、文档等文件。OSS服务具......
  • Android 14 适配之— BluetoothAdapter、JobScheduler、 Tiles
    1. BluetoothAdapter改动:在BluetoothAdapter中必须加入 BLUETOOTH_CONNECT权限 Android14(API级别34)或更高版本为目标的App,在调用函数 BluetoothAdapter getProfileConnectionState() 时,需要 BLUETOOTH_CONNECT 权限,<uses-permissionandroid:name="android......
  • 设计模式之适配器模式(学习笔记)
    定义 适配器模式是一种结构型设计模式,它允许将一个类的接口转换为客户端希望的另一个接口。适配器使得原本由于接口不兼容而不能一起工作的类可以协同工作。通过创建适配器类,可以将现有类的接口转换成目标接口,从而使这些类能够在一起工作。为什么使用适配器模式兼容性适......
  • Stable Diffusion【进阶篇】:真人漫改之IP-Adapter实现
    大家好,今天我分享真人漫改实现方式:借助ControlNet的IP-Adapter控制模型,IP-Adapter控制模型是由腾讯研究院出品的一个新的ControlNet模型,关于该模型可以理解为图片提示词,类似于MD垫图的效果,但是比tagger标签器提取出图片的元素构成效果更好。它不仅参考图片的风格、光影特效......
  • Stable Diffusion ControlNet垫图:IP-Adapter实现图片风格迁移
    IP-Adapter实现的SD垫图功能对我们的图片处理非常有用,后面我们会进行一系列IP-Adapter的应用分享,通过具体的实例真正看到IP-Adapter的强大。文章使用的AI工具SD整合包、各种模型插件、提示词、AI人工智能学习资料都已经打包好放在网盘中了,无需自行查找,有需要的小伙伴下方扫......
  • Stable Diffusion|IP-Adapter 图片风格迁移
    文末扫码可获取IP-Adapter插件!前段时间腾讯发布了一个新的ControlNet模型叫“IP-Adapter”,它的作用就是把上传的图像转化为图像提示词,简单的来说就是跟Midjourney的垫图功能差不多。IP-Adapter能够精准地识别参考图的风格特征,并且可以很好的适配其他的模型以及ControlNet......
  • JAVA设计模式>>结构型>>适配器模式
    本文介绍23种设计模式中结构型模式的适配器模式目录1. 适配器模式1.1 基本介绍1.2 工作原理 1.3  适配器模式的注意事项和细节1.4  类适配器模式1.4.1 类适配器模式介绍1.4.2 应用实例 1.4.3注意事项和细节1.5 对象适配器模式1.5.1 基本介绍1......