简单适配器SimpleAdapter继承自BaseAdapter,用于将静态数据映射到xml文件中定义好的视图当中。比如可以指定静态数据为由Map组成的ArrayList。在ArrayList中每个条目对应List中的一行,Map可以包含多项数据。
SimpleAdapter的构造方法如下:
public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to);
其中,参数context用于指定SimpleAdapter所关联的上下文对象;参数data用于指定Map列表;参数resource用于指定资源标识符(即列表项的视图布局);参数from用于指定Map列表中每项数据所对应的标签;参数to用于指定Map列表中每项数据在布局文件中所要匹配的对象。
【摘】http://www.cnblogs.com/menlsh/archive/2013/03/03/2942127.html
除了简SimpleAdapter以外,还有ArrayAdapter。其中ArrayAdapter用于绑定单一的数据,而SimpleAdapter用于绑定格式复杂的数据
ArrayAdapter的简单使用如下,其中的三个参数分别是文本,布局(这里选用的是样例),字符串数组
private ArrayAdapter<String> arrayAdapter;
String [] arr={"慕课网1","慕课网2"};
arrayAdapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arr);
最后通过获取的ListView将适配器装进去就可以了
下面是SimpleAdapter的使用
其中接收五个参数,下面是一个简单的介绍与使用,R.simple_layout里面包含的是一个imageView,id为R.id.image,和一个TextView,id为R.id.text
/**
* context:上下文
* data:数据源(List <? extends Map<String, ?>),其中的每一个Map对应一个子视图
* resource 布局,即每一个子视图
* from:Map中的键名,这个是对应着to中的子id,然后通过给此赋值来改变子元素中的内容
* to:绑定数据视图的ID,即resource中布局里面的子元素,通过此获取子元素的id,并与from中的键值对应
*/
simpleAdapter=new SimpleAdapter(this,getDate(),R.layout.simple_layout,new String[]{"pic","text"},new int[]{R.id.image,R.id.text});
listView.setAdapter(simpleAdapter);
}
private List<Map<String,Object>> getDate(){
for(int i=0;i<20;i++){
//new一个map
Map<String,Object> map=new HashMap<>();
//pic对应的是图片,text对应的是文本
map.put("pic",R.drawable.deng1);
map.put("text","mkw"+i);
data.add(map);
}
return data;
}
举个例子
1.ListView
首先是建一个加载ListView的XML文件
如下activity_main.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="vertical">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content"></ListView>
</LinearLayout>
想让ListView中的列表项显示如下
先建立一个上述的布局文件simple_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="80dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/header"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:paddingLeft="10dp"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="0dp"
android:layout_weight="3"
android:layout_height="wrap_content">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30dp"
android:textColor="#f0f"
android:paddingLeft="10dp"/>
<TextView
android:id="@+id/desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:paddingLeft="10dp"/>
</LinearLayout>
</LinearLayout>
在MainActivity.java中加载信息
private String[] names=new String[]{
"Chain","America","Canada","Russia"
};
private String[] descs=new String[]{
"traditional culture","professional technology","Chinese people very much","big place"
};
private int[] imageIds=new int[]{
R.drawable.im1,R.drawable.im2,R.drawable.im3,R.drawable.im4
};
接下来便要在OnCreate中写入SinpleAdapter的代码
分别解释
new一个以map为元素的list
List<Map<String,Object>> listItems=new ArrayList<Map<String, Object>>();
然后在其中添加Map的信息
for(int i=0;i<names.length;i++){
Map<String,Object> listItem=new HashMap<String,Object>();
listItem.put("header",imageIds[i]);
listItem.put("personName",names[i]);
listItem.put("desc",descs[i]);
listItems.add(listItem);
}
一个Map中含有三个对应的项,并将map添加到list中
下面便是将list加载到adapter中,如下
SimpleAdapter simpleAdapter=new SimpleAdapter(this,listItems,
R.layout.simple_item,
new String[]{"personName","header","desc"},
new int[]{R.id.name,R.id.header,R.id.desc});
ListView list=(ListView)findViewById(R.id.listview);
list.setAdapter(simpleAdapter);
this表示当前的context
listItems为含有map的list
R.layout.simple_item表示ListView中的列表项的布局
下面两个数组是将对应的关系确定,例如peronName对应于names[i],将其赋给R.id.name
最后在手机上显示的就像下面的一样
讲一下其他的
GridView(网格视图)
和ListView的区别在于ListView只有一列,而GridView却可以自定义列数
实现如下的图片浏览器
同样先是建一个GridVview的布局,然后再建一个GridView子项的布局,
只对MainActivity中的代码分析
加载信息
GridView grid;
ImageView imageView;
int[] imageIds=new int[]{
R.drawable.im1,R.drawable.im2,R.drawable.im3,R.drawable.im4,
R.drawable.im5,R.drawable.im6,R.drawable.im7,R.drawable.im8};
list填充
List<Map<String,Object>> listItems=new ArrayList<Map<String,Object>>();
for(int i=0;i<imageIds.length;i++){
Map<String,Object> listItem=new HashMap<String,Object>();
listItem.put("image",imageIds[i]);
listItems.add(listItem);
}
simpleAdapter
SimpleAdapter simpleAdapter=new SimpleAdapter(this,listItems,R.layout.cell,
new String[] {"image"},new int[] {R.id.image1});
grid=(GridView)findViewById(R.id.grid01);
grid.setAdapter(simpleAdapter);
最后讲一下监听器
一般都是实现接口,然后重载其中的方法
下面附一段代码
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//position表示的是点击的子元素的序号,下面一句是获取该子元素的信息
String str=listView.getItemAtPosition(position)+"";
Toast.makeText(this,str+position,Toast.LENGTH_SHORT).show();
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState){
case SCROLL_STATE_FLING:
Log.i("SIMPLEADAPTER","手指离开,惯性滑动过程");
break;
case SCROLL_STATE_IDLE:
Log.i("SIMPLEADAPTER","滚动停止");
break;
case SCROLL_STATE_TOUCH_SCROLL:
Log.i("SIMPLEADAPTER","手指正在滚动");
break;
}
}