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

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

时间:2024-08-01 14:29:10浏览次数:7  
标签:自定义 BaseAdapter 适配器 视图 import data Adapter adapter

具体作用

  • BaseAdapterAndroid 开发中一个非常重要的Adapter(适配器)基类。它提供了创建自定义适配器的基本实现,使开发者可以根据具体需求创建适用于不同视图(如 ListView、GridView)的数据适配器。以下是 BaseAdapter 的主要作用

    提供基本接口实现

    • BaseAdapter 实现了 ListAdapter 和 SpinnerAdapter 接口,因此适用于 ListView、GridView、Spinner 等组件

    自定义视图

    • 允许开发者创建自定义的视图来展示数据项,而不是使用简单的内置视图

    支持复杂布局

    • 可以使用自定义布局文件,使每个数据项的展示更加灵活和多样化

    数据管理

    • 负责管理数据集,并在数据发生变化时通知视图进行更新

参数、方法解析

  • BaseAdapter(Context context, List<T> data):构造方法;BaseAdapter是一个抽象类,它必须自定义一个子类才可以实例化

    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;
    
    import java.util.List;
    
    public class MyAdapter extends BaseAdapter {
        private Context context;
        private List<String> data;
    
        // 构造方法
        public MyAdapter(Context context, List<String> data) {
            this.context = context;
            this.data = data;
        }
    
        @Override
        public int getCount() {
            return data.size(); // 返回数据项的数量
        }
    
        @Override
        public Object getItem(int position) {
            return data.get(position); // 返回指定位置的数据项
        }
    
        @Override
        public long getItemId(int position) {
            return position; // 返回数据项的 ID,通常用位置作为 ID
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                // 如果 convertView 为空,则需要创建新的视图
                convertView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
            }
    
            // 查找视图中的 TextView
            TextView textView = convertView.findViewById(R.id.textView);
            
            // 设置 TextView 的文本为数据项
            textView.setText((String) getItem(position));
    
            return convertView; // 返回视图
        }
    }
    
    //'Arrays.asList'用于将一组对象转化为一个 List。这个方法返回一个固定大小的 List,即列表的大小不能被改变,但你可以对其进行读写操作
    List<String> data = Arrays.asList("Item 1", "Item 2", "Item 3");
    //实例化
    MyAdapter adapter = new MyAdapter(this, data);
    
    • 参数解析
      • context用于访问应用的资源、布局和其他应用环境相关的信息。在构造方法中传入,用于在适配器类中使用,如在 LayoutInflater 中创建视图时需要上下文对象
      • data数据源包含需要在列表中显示的数据项。在构造方法中传入,用于在适配器类中获取和绑定数据
  • adapter.getCount()返回数据源中项目的总数

  • adapter.getItem(int position):获取指定位置的数据项

    int mItem = adapter.getItem(0);
    
    • 参数解析
      • position:要获取的项的位置(从 0 开始的索引)
  • adapter.getItemId(int position):获取指定位置数据项的 ID

    int mItem = adapter.getItemId(0);	// 通常返回位置本身作为 ID
    
    • 参数解析
      • position:要获取项 ID 的位置(从 0 开始的索引)
  • adapter.getView(int position, View convertView, ViewGroup parent)创建并返回一个表示数据项的视图

    ListView listView = view.findViewById(android.R.id.listView_1);
    View view = adapter.getView(0, null, listView);
    
    • 参数解析
      • position要显示的数据项的位置(从 0 开始的索引)
      • convertView可重用的视图,如果该视图不为空,则可以重用以提高性能(通常是上次使用的视图)
      • parentListViewGridView 的父视图,用于生成新的视图
  • adapter.notifyDataSetChanged()通知适配器数据已发生更改,要求视图更新

使用环境解析

ListView

  • 用途显示滚动的列表项,例如消息列表联系人列表

  • BaseAdapter适用性:适合用来创建自定义列表项视图将数据源与 ListView 绑定。例如,展示自定义布局的联系人信息或产品列表

  • 示例:如果你需要显示一个包含图片和文字的复杂列表项,你可以使用 BaseAdapter 自定义适配器来实现

    • 启动类中使用它

      ListView listView = findViewById(R.id.listView);
      MyAdapter adapter = new MyAdapter(this, data);
      listView.setAdapter(adapter);
      

GridView

  • 用途:显示网格状的项,例如图片库应用图标

  • BaseAdapter 适用性:用于显示具有相同布局但不同内容的网格项。例如,创建一个自定义的图片网格

  • 示例:如果你有一个包含图片和标题的网格BaseAdapter 可以帮助你创建自定义网格项视图

    • 启动类中使用它

      GridView gridView = findViewById(R.id.gridView);
      MyAdapter adapter = new MyAdapter(this, data);
      gridView.setAdapter(adapter);
      

Spinner

  • 用途显示下拉选择菜单,例如选择国家日期等。

  • BaseAdapter 适用性:用于自定义下拉列表项的显示。例如,你可以自定义下拉项的布局和数据展示方式

  • 示例如果需要在 Spinner 中显示自定义的布局或数据格式BaseAdapter 是一个合适的选择

    • 启动类中使用它

      Spinner spinner = findViewById(R.id.spinner);
      MyAdapter adapter = new MyAdapter(this, data);
      spinner.setAdapter(adapter);
      

AutoCompleteTextView

  • 用途提供自动完成的文本输入框,例如搜索建议或输入提示

  • BaseAdapter 适用性自定义自动完成项的显示方式和数据源。例如,显示带有图片和文字的搜索建议

  • 示例如果你需要在 AutoCompleteTextView 中显示复杂的数据项或自定义视图,可以使用 BaseAdapter

    • 启动类中使用它

      AutoCompleteTextView autoCompleteTextView = findViewById(R.id.autoCompleteTextView);
      MyAdapter adapter = new MyAdapter(this, data);
      autoCompleteTextView.setAdapter(adapter);
      

总结

  • BaseAdapter 是用于创建自定义适配器的基类,适用于多种 AdapterView,如 ListViewGridViewSpinnerAutoCompleteTextView。通过继承 BaseAdapter 并实现其方法,你可以控制如何将数据项绑定到视图中,从而实现灵活的数据展示和用户界面自定义

完整代码示例

  • 创建启动类布局文件res/layout/activity_main.xml,包含一个 ListView 控件

    <?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="match_parent">
    
        <ListView
            android:id="@+id/listView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:dividerHeight="1dp"
            android:divider="@android:color/darker_gray"/>
    
    </RelativeLayout>
    
  • 创建布局文件res/layout/list_item.xml,包含一个 TextView控件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="16dp">
    
        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18sp"/>
    
    </LinearLayout>
    
  • 创建一个继承自 BaseAdapter 的自定义适配器类MyAdapter.java

    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;
    
    import java.util.List;
    
    public class MyAdapter extends BaseAdapter {
        private Context context;
        private List<String> data;
    
        // 构造方法
        public MyAdapter(Context context, List<String> data) {
            this.context = context;
            this.data = data;
        }
    
        @Override
        public int getCount() {
            return data.size(); // 返回数据项的数量
        }
    
        @Override
        public Object getItem(int position) {
            return data.get(position); // 返回指定位置的数据项
        }
    
        @Override
        public long getItemId(int position) {
            return position; // 返回数据项的 ID,通常用位置作为 ID
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                // 如果 convertView 为空,则需要创建新的视图
                convertView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
            }
    
            // 查找视图中的 TextView
            TextView textView = convertView.findViewById(R.id.textView);
            
            // 设置 TextView 的文本为数据项
            textView.setText((String) getItem(position));
    
            return convertView; // 返回视图
        }
    }
    
  • 启动类中使用自定义适配器MainActivity.java,在 MainActivity实例化自定义适配器,并将其设置到 ListView 中

    import android.os.Bundle;
    import android.widget.ListView;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import java.util.Arrays;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // 初始化数据
            List<String> data = Arrays.asList("Item 1", "Item 2", "Item 3");
    
            // 创建自定义适配器实例
            MyAdapter adapter = new MyAdapter(this, data);
    
            // 获取 ListView 并设置适配器
            ListView listView = findViewById(R.id.listView);
            listView.setAdapter(adapter);
        }
    }
    
  • 运行该应用将看到一个 ListView,其中每个列表项显示初始化数据中的字符串。该应用使用 BaseAdapter 来自定义适配器,并将其绑定到 ListView 中以显示数据。这个示例展示了如何创建和使用 BaseAdapter并在实际开发中可以根据需要进行扩展和定制

标签:自定义,BaseAdapter,适配器,视图,import,data,Adapter,adapter
From: https://www.cnblogs.com/ajunjava/p/18336590

相关文章

  • 设计模式-适配器模式( Adapter Pattern)
    设计模式-适配器模式(AdapterPattern)  概要   记忆关键词:转换,兼容接口  定义:将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。  分析:在适配器模式中,Cilent调用Adapter以获得相应功能,Adapter扩......
  • Android开发 - (适配器)Adapter类中CursorAdapter实现类详细解析
    作用将Cursor对象中的数据与AdapterView组件(如ListView、GridView等)进行绑定。以下是CursorAdapter的主要作用:1.数据源绑定数据源连接:CursorAdapter通过Cursor对象作为数据源,实现了从数据库或其他数据源(如ContentResolver查询结果)中读取数据的功能。这使得开发者能够轻松地......
  • Android开发 - (适配器)Adapter类中ArrayAdapter实现类详细解析
    作用将数组数据映射到UI组件(如ListView、Spinner等)上的角色。它是BaseAdapter的一个子类,专门用于处理简单的数据集合,如数组或列表。ArrayAdapter简化了数据到视图映射的过程,使得开发者能够以更少的代码实现数据的展示。它的主要作用为以下几点:数据绑定:它能够将一组数据......
  • 设计模式:代理、装饰和适配器模式的区别
    结构对比讲实话,博主当初学习完整设计模式时,这三种设计模式单独摘哪一种都是十分清晰和明确的,但是随着模式种类的增加,在实际使用的时候竟然会出现恍惚,例如读开源代码时,遇到不以模式命名规范的代码时,一时难以说清具体是使用的这三种里的哪一种。之所以会出现混淆的原因是,三种模式......
  • 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标签器提取出图片的元素构成效果更好。它不仅参考图片的风格、光影特效......