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

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

时间:2024-08-01 15:49:50浏览次数:15  
标签:适配器 视图 item 类中 put new data Adapter SimpleAdapter

具体作用

  • 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上下文对象,通常是 ActivityApplication 的实例
      • 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 {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // 初始化数据
            List<Map<String, String>> data = new ArrayList<>();
            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 adapter = new SimpleAdapter(this, data, R.layout.list_item, from, to);
    
            // 获取 ListView 并设置适配器
            ListView listView = findViewById(R.id.listView);
            listView.setAdapter(adapter);
        }
    }
    
  • 运行该应用将会看到一个包含三项的列表每项显示一个标题和描述。这个案例展示了如何使用 SimpleAdapter 快速将数据绑定到视图组件上适合用于展示简单的数据结构

标签:适配器,视图,item,类中,put,new,data,Adapter,SimpleAdapter
From: https://www.cnblogs.com/ajunjava/p/18336843

相关文章

  • Android开发 - (适配器)Adapter类中BaseAdapter实现类详细解析
    具体作用BaseAdapter是Android开发中一个非常重要的Adapter(适配器)基类。它提供了创建自定义适配器的基本实现,使开发者可以根据具体需求创建适用于不同视图(如ListView、GridView)的数据适配器。以下是BaseAdapter的主要作用:提供基本接口实现BaseAdapter实现了ListAd......
  • 设计模式-适配器模式( 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简化了数据到视图映射的过程,使得开发者能够以更少的代码实现数据的展示。它的主要作用为以下几点:数据绑定:它能够将一组数据......
  • Android开发 - List类中的CopyOnWriteArrayList实现类解析
    CopyOnWriteArrayList是什么CopyOnWriteArrayList是Java并发包(java.util.concurrent)中的一个并发安全的List实现类。它具有特定的设计,使得在并发场景下,读操作(如迭代)可以并发进行,而写操作(如添加、修改、删除)会进行一定的同步,但不会阻塞读操作主要特点和用法:线程安全......
  • Android开发 - List类中LinkedList实现类解析
    什么是LinkedListLinkedList是List接口的一个具体实现类,它基于双向链表数据结构来实现元素的存储和操作主要特点双向链表:LinkedList使用双向链表作为底层数据结构,每个节点(Node)包含对前一个和后一个节点的引用。这使得在LinkedList中插入和删除元素的效率很高,因为只......
  • 设计模式:代理、装饰和适配器模式的区别
    结构对比讲实话,博主当初学习完整设计模式时,这三种设计模式单独摘哪一种都是十分清晰和明确的,但是随着模式种类的增加,在实际使用的时候竟然会出现恍惚,例如读开源代码时,遇到不以模式命名规范的代码时,一时难以说清具体是使用的这三种里的哪一种。之所以会出现混淆的原因是,三种模式......
  • 如何使数据类中的属性只读?
    假设我有一个这样的类:classC:def__init__(self,stuff:int):self._stuff=stuff@propertydefstuff(self)->int:returnself._stuff然后stuff是只读的:c=C(stuff=10)print(c.stuff)#prints10并且c.stuff......
  • 判断类中是否有虚函数
    #include<iostream>#include<string>#include<stack>usingnamespacestd;#include<iostream>#include<type_traits>template<typenameT>structHasVirtual:publicT{boolhasVirtualFlag;booloperator()()......
  • ComfyUI插件:IPAdapter_plus(新版)节点
    ComfyUI插件:IPAdapter_plus(新版)节点前言:学习ComfyUI是一场持久战,而IPAdapter_plus是常用且便捷有效的风格迁移模型,可以通过提供参考图像去进行图像的生成,比如风格迁移,风格融合,人物脸部模拟等各种工作,请大家重点关注本篇内容,深刻理解节点用法!!祝大家学习顺利,早日成为ComfyUI的高手......