概述

SimpleAdapter是一种 简单的适配器,将静态数据映射到布局xml对应的视图上。它也是BaseAdapter的子类。

SimpleAdapter数据映射的组件有3类(从官网api或SimpleAdapter源码中的bindView方法中都能看出来):Checkable(e.g. CheckBox), TextView, ImageView。

下面的例子中就包含了这3类

构造说明

SimpleAdapter只有一个构造方法:

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

context:上下文

data:数据源,一个包含Map的数据集合

resource:item的布局文件

from:数据来源的key的数组,与data的Map里的key对应

to:  from中的每一项数据源 对应到的 item布局中对应组件的 id。

四个参数的关系及表明了这种数据映射到布局的关系(如下绘制的简单示意图):data是数据源,包含所有数据,data中的每一项 是一个map;from是数据源中map中的key数组;to是item布局要填充的组件id的数组(这里的组件只能是上面提到的3种)。

通过SimpleAdapter,数据被映射到对应的组件中,显示出来。下一项具体示例中有更好的体现

具体示例说明

下面具体示例,很清晰的可以看出SimpleAdapter数据映射过程和效果。

先看下示例的效果图:

下面是具体的代码

activity布局:simple_adapter_act.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/simple_adapter_lv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>

文本资源:

Strings:
<array name="anime_name">
<item>海贼王</item>
<item>进击的巨人</item>
<item>火影忍者</item>
<item>斩赤红之瞳</item>
<item>秦时明月</item>
<item>西游记</item>
<item>葫芦娃</item>
</array> <array name="anime_author">
<item>尾田荣一郎</item>
<item>谏山创</item>
<item>岸本齐史</item>
<item>タカヒロ</item>
<item>玄机科技</item>
<item>央视</item>
<item>上海美术电影</item>
</array> Colors:/赤橙黄绿青蓝紫
<color name="love_red">#FF0000</color>
<color name="love_orange">#FF7F00</color>
<color name="love_yellow">#FFFF00</color>
<color name="love_green">#00FF00</color>
<color name="love_blue_green">#00FFFF</color>
<color name="love_blue">#0000FF</color>
<color name="love_purple">#8B00FF</color>

SimpleAdapter的resouce布局,及item layout:  sasimple_adapter_item.xml

这里定义了5个组件,SimpleAdapter会将这些填充数据,2个TextView 2个ImageView 1个CheckBox.

<?xml version="1.0" encoding="utf-8"?>
<!--android:descendantFocusability 避免CheckBox抢占焦点添加-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:descendantFocusability="blocksDescendants"
android:layout_width="match_parent"
android:layout_height="70dp">
<ImageView android:id="@+id/anime_cover_img"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_width="60dp"
android:scaleType="fitCenter"
android:layout_height="60dp" /> <LinearLayout
android:layout_toRightOf="@id/anime_cover_img"
android:layout_width="150dp"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:orientation="vertical" > <TextView
android:id="@+id/anime_name_txt"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:textStyle="bold"
android:layout_weight="1" /> <TextView android:id="@+id/anime_author_txt"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:textStyle="italic"
android:layout_weight="1"/>
</LinearLayout> <ImageView
android:id="@+id/anime_likecolor_img"
android:layout_toLeftOf="@id/anime_checkbox"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_centerVertical="true"
android:layout_marginRight="10dp" /> <CheckBox android:id="@+id/anime_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true" />
</RelativeLayout>

最终的,SimpleAdapter的使用:SimpleAdapterActivity.java

package com.flx.adaptertest.simpleadapter;

import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import com.flx.adaptertest.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class SimpleAdapterActivity extends Activity {
private static final String TAG = "SimpleAdapterActivity";
private static final String ANIME_NAME = "anime_name";
private static final String ANIME_AUTHOR = "anime_author";
private static final String ANIME_COVERIMG = "anime_coverimg";
private static final String ANIME_LIKECOLOR = "anime_likecolor";
private static final String ANIME_CHECKBOX = "anime_checkbox"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.simple_adapter_act );
ListView listView = findViewById( R.id.simple_adapter_lv );
listView.setOnItemClickListener( new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d( TAG, "onItemClick: position="+ position + ";text=" + parent.getItemAtPosition(position).toString()
+";CheckBox changed="+
((CheckBox)view.findViewById(R.id.anime_checkbox)).isChecked());
}
} ); List<Map<String, Object>> datas = new ArrayList<>();
Resources resources = this.getResources();
String[] anime_names = resources.getStringArray( R.array.anime_name );
String[] anime_authors = resources.getStringArray( R.array.anime_author );
int[] coverImgs = {R.drawable.hzw1, R.drawable.jjdjr1, R.drawable.hyrz1,
R.drawable.zchzt1, R.drawable.qsmy1, R.drawable.xyj1, R.drawable.hlw1};
int[] senvenColors = {R.color.love_red, R.color.love_orange, R.color.love_yellow,R.color.love_green,
R.color.love_blue_green, R.color.love_blue,R.color.love_purple};
boolean[] anime_checkbox = {true, true, false, false, true, false, true};
for (int i = 0; i < anime_names.length; i++) {
Map<String, Object> map = new HashMap<>();
map.put(ANIME_COVERIMG, coverImgs[i]);
map.put(ANIME_NAME, anime_names[i]);
map.put(ANIME_AUTHOR, anime_authors[i]);
map.put(ANIME_LIKECOLOR, senvenColors[i]);
map.put(ANIME_CHECKBOX, anime_checkbox[i]);
datas.add(map);
}
String[] from = {ANIME_COVERIMG, ANIME_NAME, ANIME_AUTHOR, ANIME_LIKECOLOR,ANIME_CHECKBOX};
int[] to =
{R.id.anime_cover_img, R.id.anime_name_txt, R.id.anime_author_txt, R.id.anime_likecolor_img, R.id.anime_checkbox};
SimpleAdapter simpleAdapter = new SimpleAdapter( this, datas, R.layout.simple_adapter_item, from, to );
listView.setAdapter(simpleAdapter);
}
}

看下点击效果:

点击第一项看到log

2019-11-25 14:27:06.254 9363-9363/com.flx.adaptertest D/SimpleAdapterActivity: onItemClick: position=0;text={anime_name=海贼王,
anime_likecolor=2131034168, anime_checkbox=true, anime_author=尾田荣一郎, anime_coverimg=2131165272};CheckBox changed=true

点击第一项中的checkbox,去掉勾选后,再点击第一项看到的log

2019-11-25 14:29:02.631 9363-9363/com.flx.adaptertest D/SimpleAdapterActivity: onItemClick: position=0;text={anime_name=海贼王,
anime_likecolor=2131034168, anime_checkbox=true, anime_author=尾田荣一郎, anime_coverimg=2131165272};CheckBox changed=false

注意到CheckBox值的变化了吗,整个item中看到的anime_checkbox值并没有变化。个人理解是 将静态数据映射到视图,绑定到视图时已经值已经确定了,点击checkbox,视图数据并没有刷新,所以可以通过view获取checkbox获取状态。

 

Android_适配器(adapter)之SimpleAdapter的更多相关文章

  1. Android_适配器(adapter)之BaseAdapter

    BaseAdapter是应用最多的一种适配了.它是一个抽象类,需要重写方法完成自定义适配器的功能,这就比较自由灵活,能实现各种想要的效果. 之前讲到的SimpleAdapter和ArrayAdapte ...

  2. Android_适配器(adapter)之ArrayAdapter

    ArrayAdapter是一个很简单的适配器,是BaseAdapter的子类. ArrayAdapter绑定的数据是集合或数组,比较单一.视图是列表形式,ListView 或 Spinner. Arr ...

  3. Android适配器Adapter学习

    在开发中我们需要绑定一些数据展现到桌面上,这是就需要AdapterView.AdapterView是ViewGroup的子类,它决定了怎么展现视图通过Adapter来绑定特殊的数据类型. Adapte ...

  4. android 适配器 ArrayAdapter,SimpleAdapter的学习

    今天认真看了下android适配器,学习了下它的使用方法. 一,ArrayAdapter ArrayAdapter 比较简单,只可以存放一行文本信息.下面是简单的实现 private ListView ...

  5. 安卓开发笔记——打造万能适配器(Adapter)

    为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需 ...

  6. 设计模式--适配器(Adapter)模式

    今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)&g ...

  7. 【原】模式之-适配器Adapter模式

    适配器Adapter模式 适配器模式(Adapter Pattern)把一个类的接口变换成客户端所期待的的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 模式所涉及的角色有 ...

  8. Ruby设计模式透析之 —— 适配器(Adapter)

    转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/9400153 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...

  9. 理解什么是适配器(adapter)和接口(interface)

    ● 适配器(adapter) In computing, adapter is a hardware device or software component that converts transm ...

随机推荐

  1. 数学--数论--HDU 6128 Inverse of sum (公式推导论)

    Description 给nn个小于pp的非负整数a1,-,na1,-,n,问有多少对(i,j)(1≤i<j≤n)(i,j)(1≤i<j≤n)模pp在意义下满足1ai+aj≡1ai+1aj ...

  2. Windows 10配置VS Code C++环境(超详细,面向小白以及大佬们)

    看完这个,还有下一篇:门在这 我看了网上的大佬们配的我是在是看不懂啊?我是一个小白啊?这太难了,这阻挡不了我,想使用这很骚的IDE,于是在不断的摸索下,终于配置成功,小白们也不用慌,这次非常简单.一定 ...

  3. RobotFrameWork 自动化环境搭建(基于 python3.6)

    一.需要安装的工具目录 安装 python3.6.0 我这里采用的是 python3.6 (目前慢慢市场在推广 python3.0 版本了) 安装 wxPython(Python 非常有名的一个GUI ...

  4. 一只简单的网络爬虫(基于linux C/C++)————守护进程

    守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常常在系统引导装入时启动, ...

  5. Java——Java面向对象

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 概述: Java是面 ...

  6. P1750 出栈序列

    这好像是普及难度的吧~ 感觉再次被小学生吊打了........ \(\color{Red}{----------------------=|(●'◡'●)|=我是手动的分割线------------- ...

  7. 第六章第二十题(计算一个字符串中字母的个数)(Count the letters in a string) - 编程练习题答案

    *6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法头计算字符串中的字母个数: public static int countLetters(String s) 编写一个测试程序,提示 ...

  8. 闲来无事做个C#小项目——1

    2020-05-10 12:25:47 项目背景就是最近和一些朋友在玩一个游戏,游戏中有一个囤货的东西,就是买进卖出的,然后为了方便计算,所以就先写一个简单的计算器用来算账, 这是界面图(最初形态,没 ...

  9. 推荐 10个 NB的 IDEA 插件,开发效率至少提升一倍

    友情提示:插件虽好,可不要贪装哦,装多了会 卡 .卡 .卡 ~ 正经干活用的 分享一点自己工作中得心应手的IDEA插件,可不是在插件商店随随便便搜的,都经过实战检验,用过的都说好.可能有一些大家用过的 ...

  10. HDU 2001 (水)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2001 题目大意:两个点求距离 解题思路: 套基本公式 a = √(b2 + c2); 小数点后几位的表 ...