Android笔记(二十一) Android中的Adapter
Android中有一些View是包含多个元素的,例如ListView,GridView等,为了给View的每一个元素都设置数据,就需要Adapter了。
常用的Adapter包括ArrayAdapter和SimpleAdapter。
ArrayAdapter
ArrayAdapter比较简单,它只能用于显示文字。看代码:
MainActivity.java
package cn.lixyz.listviewtest; import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast; public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener{ private ListView listView; private String[] data = {"橘子","苹果","香蕉","西瓜","樱桃","猕猴桃","木瓜","山竹",
"桃","葡萄","山楂","杏","核桃","哈密瓜","菠萝","柚子","无花果","柠檬","李子"}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data); listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);
listView.setOnItemClickListener(this);
} @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String text = listView.getItemAtPosition(position) + "";
Toast.makeText(this,"position=" + position + " text=" + text,Toast.LENGTH_SHORT).show(); Intent intent = new Intent(MainActivity.this,ShowFruit.class);
intent.putExtra("fruitNum",position);
startActivity(intent);
}
}
activity_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"> <ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
> </ListView> </LinearLayout>
ShowFruit.java
package cn.lixyz.listviewtest; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView; public class ShowFruit extends AppCompatActivity { private String[] data = {"橘子橘子橘子橘子橘子", "苹果苹果苹果苹果苹果", "香蕉香蕉香蕉香蕉香蕉",
"西瓜西瓜西瓜西瓜西瓜", "樱桃樱桃樱桃樱桃樱桃", "猕猴桃猕猴桃猕猴桃猕猴桃猕猴桃",
"木瓜木瓜木瓜木瓜木瓜", "山竹山竹山竹山竹山竹", "桃桃桃桃桃", "葡萄葡萄葡萄葡萄葡萄",
"山楂山楂山楂山楂山楂", "杏杏杏杏杏", "核桃核桃核桃核桃核桃", "哈密瓜哈密瓜哈密瓜哈密瓜哈密瓜",
"菠萝菠萝菠萝菠萝菠萝", "柚子柚子柚子柚子柚子", "无花果无花果无花果无花果无花果",
"柠檬柠檬柠檬柠檬柠檬", "李子李子李子李子李子"}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_fruit); int i = getIntent().getIntExtra("fruitNum", -1);
((TextView) findViewById(R.id.tv_fruit_desc)).setText(data[i]); findViewById(R.id.bt_back).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
activity_show_fruit.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="cn.lixyz.listviewtest.ShowFruit"
android:orientation="vertical"> <TextView
android:id="@+id/tv_fruit_desc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="60sp"/> <Button
android:id="@+id/bt_back"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="返回"/>
</LinearLayout>
运行结果:
Simpleadapter
名字叫simple其实并不simple,它可以帮助我们实现更复杂的界面,ListView的大部分应用场景,都可以通过SimpleAdapter来提供列表项。
如图:
实现代码:
MainActivity.java
package cn.lixyz.listviewtest; import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter; import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects; public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener { private ListView listView; private String[] data = {"橘子", "苹果", "香蕉", "西瓜", "樱桃", "猕猴桃", "木瓜", "山竹",
"桃", "葡萄", "山楂", "杏", "核桃", "哈密瓜", "菠萝", "柚子", "无花果", "柠檬", "李子"}; private List<Map<String, Object>> dataList; private String[] from = {"iv_fruit_show", "tv_fruit_name"};
private int[] to = {R.id.iv_fruit_show, R.id.tv_fruit_name}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.list_view);
dataList = new ArrayList<Map<String, Object>>();
SimpleAdapter sa = new SimpleAdapter(MainActivity.this, getData(), R.layout.layout_adapter, from, to); listView.setAdapter(sa); listView.setOnItemClickListener(this);
} private List<Map<String, Object>> getData() { List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 18; i++) {
list.add(getIdByName(MainActivity.this, "drawable", "pic" + i));
} for (int i = 0; i < 18; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("iv_fruit_show", list.get(i));
map.put("tv_fruit_name", data[i]);
dataList.add(map);
}
return dataList;
} public static int getIdByName(Context context, String className, String resName) {
String packageName = context.getPackageName();
int indentify = context.getResources().getIdentifier(resName, className, packageName);
return indentify;
} @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(MainActivity.this, ShowFruit.class);
intent.putExtra("index", position);
startActivity(intent);
}
}
activity_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"> <ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
> </ListView> </LinearLayout>
ShowFruit.java
package cn.lixyz.listviewtest; import android.content.Context;
import android.media.Image;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView; import static cn.lixyz.listviewtest.R.drawable.pic0; public class ShowFruit extends AppCompatActivity { private String[] data = {"橘子橘子橘子橘子橘子", "苹果苹果苹果苹果苹果", "香蕉香蕉香蕉香蕉香蕉",
"西瓜西瓜西瓜西瓜西瓜", "樱桃樱桃樱桃樱桃樱桃", "猕猴桃猕猴桃猕猴桃猕猴桃猕猴桃",
"木瓜木瓜木瓜木瓜木瓜", "山竹山竹山竹山竹山竹", "桃桃桃桃桃", "葡萄葡萄葡萄葡萄葡萄",
"山楂山楂山楂山楂山楂", "杏杏杏杏杏", "核桃核桃核桃核桃核桃", "哈密瓜哈密瓜哈密瓜哈密瓜哈密瓜",
"菠萝菠萝菠萝菠萝菠萝", "柚子柚子柚子柚子柚子", "无花果无花果无花果无花果无花果",
"柠檬柠檬柠檬柠檬柠檬", "李子李子李子李子李子"}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_fruit); int i = getIntent().getIntExtra("index", -1);
int picId = getIdByName(this, "drawable", "pic" + i); ((ImageView) findViewById(R.id.iv_fruit_show)).setImageResource(picId);
((TextView) findViewById(R.id.tv_fruit_desc)).setText(data[i]); } public static int getIdByName(Context context, String className, String resName) {
String packageName = context.getPackageName();
int indentify = context.getResources().getIdentifier(resName, className, packageName);
return indentify;
}
}
activity_show_fruit.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="cn.lixyz.listviewtest.ShowFruit"
android:orientation="vertical"> <ImageView
android:id="@+id/iv_fruit_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/> <TextView
android:id="@+id/tv_fruit_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
layout_adapter.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:orientation="horizontal"
android:weightSum="1"> <ImageView
android:id="@+id/iv_fruit_show"
android:layout_width="80dp"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:src="@drawable/pic0"/> <TextView
android:id="@+id/tv_fruit_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1111"
android:textSize="50dp" /> </LinearLayout>
查看API,发现SimpleAdapter可以将静态数据映射到xml文件定义好的视图中去,你可以指定数据支持的列表如ArrayList组成的Map,在ArrayList中的每个条目对应List中的一行,Maps包含每行数据,你可以指定一个定义了被用于显示行的视图XML文件,通过关键字映射到指定的视图。绑定数据到视图分为两个阶段,首先,如果一个SimpleAdapter.ViewBinder是有效的,setViewValue(android.View.view,Object,String)将被调用。如果返回值是真,绑定成功,如果返回值为假,下面的视图将按照以下顺去去处理:
- l 一个实现了Checkable的视图(例如CheckBox),期望绑定值是一个布尔类型。
- l TextView期望绑定值是一个字符串类型,通过调用setViewText(TextView, String)绑定。
- l ImageView期望绑定值是一个资源id或者一个字符串,通过调用setViewImage(ImageView, int) 或 setViewImage(ImageView, String)。
如果没有一个合适的绑定发生将会抛出IllegalStateException
SimpleAdapter的构造函数
public SimpleAdapter(Context context, List<?extends Map<String,?>> data, int resource, String[] from, int[] to)
参数:
context:关联SimpleAdapter运行着的视图的上下文
data:一个Map列表,在列表中的每个条目对应列表中的一行,应该包含所有在from指定的条目
resource:一个定义列表项目视图布局的资源唯一表示。布局文件将至少应包含哪些定义在to中定义了的名称
from:一个将被添加到Map上关联每一个项目的列名称的列表
to:应该在参数from显示列的视图,这些应该全是TextView。在列表中最初的N视图是从参数from中最初的N列获取的值
Android笔记(二十一) Android中的Adapter的更多相关文章
- python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法
python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0.zfill()方法语法:s ...
- Android笔记(十一) Android中的布局——网格布局
网格布局是Android4.0新增的布局管理器,因此需要在Android4.0之后的版本才可以使用,之前的平台使用该布局的话,需要导入相应的支持库. GridLayout的作用类似于HTML中的tab ...
- Android笔记二十四.Android基于回调的事件处理机制
假设说事件监听机制是一种托付式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器全然消失了,当用户在GUI控件上激发某个事件时,控 ...
- Android核心分析之二十一Android应用框架之AndroidApplication
Android Application Android提供给开发程序员的概念空间中Application只是一个松散的表征概念,没有多少实质上的表征.在Android实际空间中看不到实际意义上的应用程 ...
- Android笔记(十一)第一个Fragment
Fragment是碎片的意思,能够參照Activity来理解Fragment,由于它们都能包括布局,都有自己的生命周期. 以下我们要让主活动包括两个碎片,而且让两个碎片充满屏幕 1.首先,新建两个碎片 ...
- Android笔记(六十三) android中的动画——逐帧动画( frame-by-frame animation)
就好像演电影一样,播放实现准备好的图片,来实现动画效果. 逐帧动画需要用到AnimationDrawable类,该类主要用于创建一个逐帧动画,然后我们把这个动画设置为view的背景即可. androi ...
- android笔记5——同一个Activity中Fragment的切换
今天来模拟一个注冊的界面过程: 点击"下一步"之后: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZW5zb24xNjg1NQ==/f ...
- Android笔记——我的Android课的开始
android 最底层的是什么? 硬件 介于硬件与软件之间的一个交互,你猜猜需要什么? 软件的上面一层便是各种的类库 硬件与软件之间的交互,就是需要驱动的进行. 1.android系统架构 1.Li ...
- Android进阶(二十七)Android原生扰人烦的布局
Android原生扰人烦的布局 在开发Android应用时,UI布局是一件令人烦恼的事情.下面主要讲解一下Android中的界面布局. 一.线性布局(LinearLayout) 线性布局分为: (1) ...
- Android进阶(二十三)Android开发过程之实例讲解
Android开发过程之实例讲解 前言 回过头来审视之前做过的Android项目,发觉自己重新开发时忽然间不知所措了,间隔了太长时间没有开发导致自己的Android技能知识急剧下降.温故而知新. 废话 ...
随机推荐
- DataTable.NET 使用server-side processing
https://datatables.net/examples/server_side/simple.html 當頁面上要顯示的數據在10萬筆以上時,可以使用server-side processin ...
- ACS712电流传感器应用
1. 原理图 其中第7脚输出的是电压值,那么电压值和测量的电流什么关系?看下图,有3个量程,我用的是20A电流的,100mv电压对应1A电流 看下图,不同的温度会有影响,不过区别不大 最后计算的公式是 ...
- MYSQL:基础——索引原理及慢查询优化
MYSQL:基础——索引原理及慢查询优化 索引的数据结构 索引的数据结构是B+树.如下图所示,B+树的节点通常被表示为一组有序的数据项和子指针.图中第一个节点包含数据项3和5,包含三个指针,第一个指针 ...
- React:快速上手(8)——前后端分离的跨域访问与会话保持
React:快速上手(8)——前后端分离的跨域访问与会话保持 跨域访问 跨域是指从一个域名的网页去请求另一个域名的资源.比如从http://www.baidu.com/ 页面去请求http://www ...
- Django:ORM中ForeignKey外键关系分析
假设有两张表,Role和User,因为多个用户会对应一个角色,属于多对一关系,所以User中的rolename字段使用ForeignKey,第一个参数为要关联的表Role,第二个参数related_n ...
- SPSS 习题-2
1.有关SPSS数据字典的说法,正确的是: AA. SPSS 数据集的数据字典可以复制到其他数据集中B. SPSS数据集的数据字典是不能复制的C. SPSS的数据字典可以通过“复制”和“粘贴”在不同 ...
- 【坑】SpringMvc 处理JSON 乱码
文章目录 前言 方法 前言 在使用 springMvc 的时候,如果向前台返回 JSON 数据,JSON 中的中文会乱码: 即使你在配置了全局的信息编码拦截器,也无济于事: 原因大抵是,JSON 的内 ...
- [C++] 习题 2.14 用队列实现桶排序
目录 前置技能 队列(已在上篇提到栈的时候顺便提到了,不再赘述) 桶排序 具体实现 由用户输入n个10以内的数,每输入i(0≤i≤9),就把它插入第i号队列中,最后把10个队列中的非空队列,按队列号从 ...
- TCP/IP协议图--TCP/IP基础
1. TCP/IP 的具体含义 从字面意义上讲,有人可能会认为 TCP/IP 是指 TCP 和 IP 两种协议.实际生活当中有时也确实就是指这两种协议.然而在很多情况下,它只是利用 IP 进行通信时所 ...
- 数据结构-单链表-类定义2-C++
上一次的C++链表实现两个单链表的连接不太理想,此次听了一些视频课,自己补了个尾插法,很好的实现了两个链表的连接,当然了,我也是刚接触,可能是C++的一些语法还不太清楚,不过硬是花了一些时间尽量在数据 ...