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

简介

  • 用于将静态数据绑定到 ListView 或 GridView,支持更复杂的布局

具体作用

  • SimpleAdapter 的主要作用是简化将数据源(如 List<Map<String, Object>>)绑定到视图组件(如 TextView、ImageView 等)的过程它可以根据指定的键将数据映射到指定的视图组件上从而快速实现数据的展示

参数、方法解析

  • SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)构造方法

    List<Map<String, String>> data = new ArrayList<Map<String, String>>();
    Map<String, String> item1 = new HashMap<String, String>();
    item.put("text1", "Item 1");
    item.put("text2", "Description 1");
    data.add(item);
    String[] from = {"text1", "text2"};
    int[] to = {R.id.text1, R.id.text2};
    SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.list_item, from, to);
    
    • 参数解析
      • context上下文对象,通常是 Activity 或 Application 的对象
      • data数据源,通常是一个 List<Map<String, ?>>每个 Map 对象代表列表中的一行数据
      • resource列表项布局文件的资源 ID
      • from一个字符串数组指定 Map 对象中与视图组件绑定的数据的键
      • to一个整型数组指定绑定数据的视图组件的 ID
  • adapter.getCount()得到适配器中数据项的数量也就是 data 列表的大小

  • adapter.getItem(int position):得到指定位置的数据项。该数据项是 data 列表中的一个 Map 对象

    Object item = adapter.getItem(0);
    
    • 参数解析
      • position数据项的位置(索引),从 0 开始
  • adapter.getItemId(int position):得到指定位置的数据项的 ID。这里简单地返回位置索引

    int item = adapter.getItemId(0);
    
    • 参数解析
      • position数据项的位置(索引),从 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复用的视图对象,如果为空则需要创建新的视图通过复用视图来提高性能
      • parent:包含该视图的父视图组(通常是 ListView 或 GridView)
  • adapter.setViewBinder(SimpleAdapter.ViewBinder viewBinder)

    // 自定义视图绑定器:在这个示例中,data 是一个 Long 类型的时间戳。通过检查 data 的类型,我们将其转换为特定格式的日期字符串
    adapter.setViewBinder(new SimpleAdapter.ViewBinder() {
        @Override
        public boolean setViewValue(View view, Object data, String textRepresentation) {
            if (view instanceof TextView && data instanceof Long) {
                // 将时间戳转换为日期字符串
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault());
                ((TextView) view).setText(dateFormat.format(new Date((Long) data)));
                return true;
            } else if (view instanceof TextView) {
                ((TextView) view).setText(textRepresentation);
                return true;
            }
            return false;
        }
    });
    
    • 参数解析
      • viewBinder实现了 SimpleAdapter.ViewBinder 接口的对象,用于自定义数据和视图的绑定逻辑。可以通过自定义绑定逻辑来处理复杂的数据绑定需求
    • setViewValue(View view, Object data, String textRepresentation)
      • 参数解析
        • view:要绑定数据的视图
        • data绑定到视图的数据
        • textRepresentation数据的字符串表示形式
  • getViewBinder():得到当前的视图绑定器(viewBinder

使用场景解析

  • SimpleAdapterAndroid 提供的一个简单的适配器类,用于将数据映射到视图组件上。它非常适合在以下场景中使用:

    简单的数据绑定

    • 当你有一个简单的数据结构,并且需要将这些数据绑定到一个列表项布局时,SimpleAdapter 是非常方便的选择。例如,你有一个包含字符串和整数的列表,并且需要将这些数据展示在 ListView 中

      List<Map<String, String>> data = new ArrayList<Map<String, String>>();
      Map<String, String> item = new HashMap<String, String>();
      item.put("title", "Title 1");
      item.put("description", "Description 1");
      data.add(item);
      
      item = new HashMap<String, String>();
      item.put("title", "Title 2");
      item.put("description", "Description 2");
      data.add(item);
      
      String[] from = {"title", "description"};
      int[] to = {R.id.titleTextView, R.id.descriptionTextView};
      
      SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.list_item, from, to);
      ListView listView = findViewById(R.id.listView);
      listView.setAdapter(adapter);
      

    静态数据

    • 当数据是静态的或在运行时不会频繁更新时SimpleAdapter 可以快速而简单地实现数据绑定。例如,一个静态的菜单列表,或者一个固定的设置选项列表

    • 静态数据列表示例

      List<Map<String, String>> data = new ArrayList<>();
      String[] titles = {"Home", "Profile", "Settings", "Logout"};
      for (String title : titles) {
          Map<String, String> item = new HashMap<>();
          item.put("title", title);
          data.add(item);
      }
      
      String[] from = {"title"};
      int[] to = {R.id.titleTextView};
      
      SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.list_item, from, to);
      ListView listView = findViewById(R.id.listView);
      listView.setAdapter(adapter);
      

    原型开发

    • 在原型开发或快速迭代阶段,使用 SimpleAdapter 可以迅速搭建一个数据展示的界面,而不需要编写大量的自定义适配器代码

    演示和教学

    • 进行演示或教学时,使用 SimpleAdapter 可以清晰地展示数据绑定的基本原理,而不需要复杂的代码示例

    • 演示用途示例

      List<Map<String, Object>> data = new ArrayList<<Map<String, Object>>>();
      Map<String, Object> item = new HashMap<String, Object>();
      item.put("image", R.drawable.ic_launcher);
      item.put("title", "Title 1");
      item.put("description", "Description 1");
      data.add(item);
      
      item = new HashMap<String, Object>();
      item.put("image", R.drawable.ic_launcher);
      item.put("title", "Title 2");
      item.put("description", "Description 2");
      data.add(item);
      
      String[] from = {"image", "title", "description"};
      int[] to = {R.id.imageView, R.id.titleTextView, R.id.descriptionTextView};
      
      SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.list_item, from, to);
      ListView listView = findViewById(R.id.listView);
      listView.setAdapter(adapter);
      

    少量数据项

    • 数据项的数量较少,并且布局相对简单时SimpleAdapter 可以减少开发时间和复杂度。例如,一个包含几个选项的简单列表

    • 少量数据项示例

      List<Map<String, String>> data = new ArrayList<<Map<String, String>>>();
      Map<String, String> item1 = new HashMap<String, String>();
      item1.put("name", "Alice");
      item1.put("age", "25");
      data.add(item1);
      
      Map<String, String> item2 = new HashMap<String, String>();
      item2.put("name", "Bob");
      item2.put("age", "30");
      data.add(item2);
      
      String[] from = {"name", "age"};
      int[] to = {R.id.nameTextView, R.id.ageTextView};
      
      SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.list_item, from, to);
      ListView listView = findViewById(R.id.listView);
      listView.setAdapter(adapter);
      

    结论

    • SimpleAdapter 是一个非常方便的适配器类,适合在简单的数据绑定场景中使用。它能够快速简洁地将数据映射到视图上特别适用于静态数据少量数据项原型开发演示和教学等场景

完整代码示例

  • res/layout 目录下创建两个布局文件:启动类布局文件列表项布局文件

    • activity_main.xml (启动类布局文件):定义了一个 ListView,用于显示列表项

      <?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="match_parent"
          android:orientation="vertical">
      
          <ListView
              android:id="@+id/listView"
              android:layout_width="match_parent"
              android:layout_height="match_parent" />
      </LinearLayout>
      
    • 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/titleTextView"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:textSize="18sp"
              android:textColor="@android:color/black" />
      
          <TextView
              android:id="@+id/descriptionTextView"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:textSize="14sp"
              android:textColor="@android:color/darker_gray" />
      </LinearLayout>
      
  • 在 src 目录下创建一个新的启动类 MainActivity.java。在这个类中初始化数据并使用 SimpleAdapter 将数据绑定到 ListView

    package com.example.simpleadapterexample;
    
    import android.os.Bundle;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class MainActivity extends AppCompatActivity {
    	//在 onCreate 方法中初始化数据。数据被存储在一个 List<Map<String, String>> 中
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // 初始化数据
            List<Map<String, String>> data = new ArrayList<>();
            //每个 Map 对象代表一个列表项
            Map<String, String> item1 = new HashMap<>();
            item1.put("title", "Title 1");
            item1.put("description", "Description 1");
            data.add(item1);
    
            Map<String, String> item2 = new HashMap<>();
            item2.put("title", "Title 2");
            item2.put("description", "Description 2");
            data.add(item2);
    
            Map<String, String> item3 = new HashMap<>();
            item3.put("title", "Title 3");
            item3.put("description", "Description 3");
            data.add(item3);
    
            // 创建 SimpleAdapter 实例
            String[] from = {"title", "description"};
            int[] to = {R.id.titleTextView, R.id.descriptionTextView};
    		
            //使用 SimpleAdapter 将数据绑定到列表项布局上。构造 SimpleAdapter 实例时,传入上下文、数据源、列表项布局资源 ID、数据键数组和视图 ID 数组
            SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.list_item, from, to);
    
            // 获取 ListView 并设置适配器
            ListView listView = findViewById(R.id.listView);
            //将 SimpleAdapter 设置为 ListView 的适配器,以显示数据
            listView.setAdapter(adapter);
        }
    }
    
  • 运行该应用将会看到一个包含三项的列表每项显示一个标题和描述。这个案例展示了如何使用 SimpleAdapter 快速将数据绑定到视图组件上适合用于展示简单的数据结构

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