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

简介

  • 提供自定义 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
            MyAdapter adapter = new MyAdapter(this, data);
    
            // 获取 ListView 并设置适配器
            ListView listView = findViewById(R.id.listView);
            listView.setAdapter(adapter);
        }
    }
    
  • 运行该应用将看到一个 ListView,其中每个列表项显示初始化数据中的字符串。该应用使用 BaseAdapter 来自定义适配器,并将其绑定到 ListView 中以显示数据。这个示例展示了如何创建和使用 BaseAdapter并在实际开发中可以根据需要进行扩展和定制

posted @ 2024-08-01 14:23  阿俊学JAVA  阅读(320)  评论(0编辑  收藏  举报