Android 之 SimpleAdapter 学习笔记

 

•SimpleAdapter简介

  simpleAdapter 的扩展性最好,可以定义各种各样的布局出来;

  可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。

准备工作

  新建一个项目,选择 Empty Activity 选项;

  Android Studio 会自动为我们生成两个文件 MainActivity.java 和 activity_main.xml;

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Test Simple Adapter"
        android:textSize="20sp"
        />

    <!--    为 ListView 设置红色的分割线
            并将分割线宽度设置为 2dp      -->
    <ListView
        android:id="@+id/lv_simple_adapter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:divider="@color/red"
        android:dividerHeight="2dp"
        />
</LinearLayout>

  在 res/layout 新建一个 simple_adapter_item.xml 文件;

simple_adapter_item.xml

<?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:padding="10dp"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/header"
        android:layout_width="100dp"
        android:layout_height="160dp"
        android:scaleType="centerCrop"
        />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="160dp"
        android:orientation="vertical"
        android:layout_marginLeft="10dp">

        <TextView
            android:id="@+id/name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:gravity="left"/>
        <TextView
            android:id="@+id/desc"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="13sp"
            android:textColor="@color/gray"
            android:gravity="left"/>
    </LinearLayout>
</LinearLayout>

页面布局说明

  1. 整体采用线性布局,并以水平排列。
  2. 左边第一项定义一个ImageView组件,用来显示图片。
  3. 右边嵌套一个线性布局,并以垂直排列。
  4. 嵌套的线性布局里面定义了两个TextView,一个显示名字,一个显示介绍。

  simple_adapter_item布局示意图如下:

    

  最后,修改 MainActivity.java 中的代码;

MainActivity.java

public class SimpleAdapterActivity extends AppCompatActivity {

    private ListView listview;
    private String[] name = new String[]{"关羽","孙尚香","娜可露露"};
    private String[] desc = new String[]{
            "暴风雪的远征者,冰凌北地的灾厄之王!\n"+"为我们的永生而战,为我们的不朽而战!\n"+"奉上领地,或者化为冻腐的尘埃!",
            "大小姐驾到,通通闪开!\n"+"来发子弹吗?满足你!\n"+"你,也是本小姐的粉丝吗?",
            "啊里噶多,玛玛哈哈\n"+"萨,特几那赛\n"+"一待!玛玛哈哈"
    };
    private int[] head = new int[]{
            R.drawable.guan_yu,
            R.drawable.sun_shang_xiang,
            R.drawable.na_ke_lu_lu
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simple_adapter_main);
        SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.simple_adapter_item,new String[]{"name","desc","header"},new int[]{
                R.id.name,R.id.desc,R.id.header
        });

        listview = findViewById(R.id.lv_simple_adapter);
        listview.setAdapter(adapter);
    }

    private List<Map<String,Object>> getData(){

        List<Map<String,Object>> list = new ArrayList<>();

        for(int i = 0;i < name.length;i++){
            Map<String,Object> map = new HashMap<>();
            map.put("name",name[i]);
            map.put("desc",desc[i]);
            map.put("header",head[i]);
            list.add(map);
        }
        return list;
    }
}

说明

  1. 定义了一个 String 数组 name,用来定义名称。
  2. 定义了一个 String 数组 desc,用来定义介绍。
  3. 准备几张图片,拷贝到 drawable 文件夹(网上随便找几张就行),然后定义一个 int 数组,把图片 ID 加进来。
  4. 定义一个  List<Map<String,Object>>getData()  方法,用来获取列表项。
  5. 创建一个 SimpleAdapter 对象。
  6. 设置 ListView 的 Adapter 为刚创建的 simpleAdapter。

  使用 simpleAdapter 的数据项一般都是 HashMap 构成的 List,List 的每一节对应 ListView 的每一行。

  HashMap 的每个键值数据映射到布局文件中对应id的组件上。

  因为系统没有对应的布局文件可用,所以需要我们自己定义一个布局 simple_adapter_item.xml。

SimpleAdapter中参数所表达的意思

   new SimpleAdapter(Context context, List<? extends Map<String,?>>data,int resource,String[] from,int[] to); 

  •  Context context  : 表示上下文对象,就是要展示 ListView 的 Activity,或者是通过 getApplicationContext() 得到的上下文对象
  •  List<? extends Map<String,?>>data  : 用于在列表中显示的数据,传入的数据必须是  List<? extends Map<String,?>>  的实现类
    • 比如 List<Map<String,Object>>
  •  int resource  : ListView 中显示的每行子 View 的资源文件,就是位于 layout 文件夹中的 .xml 布局文件
  •  String[] from  : 表示 Map<String,Object> 中存放的 Key 键值,因为它要通过键值才能找到对应的 Value,也就是布局要显示的内容
  •  int[] to  : 表示要显示出来的 resource 布局文件的 R.id.xx 值,它和 from 中的数据源选项要一一对应

•运行效果

  

 

posted @ 2021-01-25 21:11  MElephant  阅读(441)  评论(0编辑  收藏  举报