Android 比较好的学习博客:各个组件的学习:http://blog.csdn.net/jianghuiquan/article/category/1291936/6
一、SimpleAdapter----封装复杂数据
1. SimpleAdapter
这是一个简单的适配器,可以将静态数据映射到XML文件中定义好的视图。你可以指定由Map组成的List(比如ArrayList)类型的数据。在ArrayList中的每个条目对应List中的一行。Maps包含每一行的数据。你可以指定一个XML布局以指定每一行的视图,根据Map中的数据映射关键字到指定的视图。
先看一下SimpleAdapter的构造函数:
Public SimpleAdapter(Context context,
List<?extends Map<String,?>>data,
int resource,
String[] from,
int[] to)
各参数含义:
-
context SimpleAdapter关联的View的运行环境
-
data 一个Map组成的List。在列表中的每个条目对应列表中的一行,
-
每一个map中应该包含所有在from参数中指定的键
-
resource 一个定义列表项的布局文件的资源ID。布局文件将至少应包含那些在to中定义了的ID
-
from 一个将被添加到Map映射上的键名
-
to 将绑定数据的视图的ID,跟from参数对应,这些应该全是TextView
实例—-模拟QQ好友列表
1. 我们创建Android项目(SimpleAdapterDemo)
2. 首先需要创建一个qq列表模板显示文件(layout/item.xml)
那么我们大致的布局构思是左侧显示用户的头像,右侧显示用户的昵称和签名,接下来我们的设计如下:
3. 模板设置好之后,我们需要在layout/main.xml中设置其陈列方式
values/string.xml
4. 完成上面的工作之后,我们转战MainActivity.java
第一步,我们需要将事先准备好的QQ头像图片资源copy到项目res/drawable-hdpi下
第二步,接下来我们需要定义一个二维数组,用户存放QQ好友信息
第三步,定义一个封装数据的Map集合,再定义一个ListView和SimpleAdapter
第四步,接下来,我们需要在onCreate()方法里面进行实际的操作了 a.首先需要获取ListView控件
b.接下来给定义好的qqListView封装数据
c.初始化一个SimpleAdapter
d.给qqlList设置适配器,设置后就会有数据了
5. 至此,我们的程序就基本完成了,我们可以运行查看一下效果
6. 那么我们看到这个界面是比较粗糙的,为了改善用户体验,我们可以适当做一下界面美化 修正一:将“QQ好友列表”一行字居中显示,并设置字体大小
修正二:使得头像距离底部5dp
修正三:使得昵称距离顶部和左侧各5dp,距离底部10dp,且将字体设为粗体
修正四:设置签名距离左侧5dp
好了,大致做完这些修改之后,我们再来查看一下其效果
以上是我们做修改的地方,是不是比之前好看了些呢! 第十三节 ListView 事件 一、 学习ListView,我们以之前的qqList基础来练习 二、 例如我们需要在其上练习ListView的以下三个事项 1,OnItemSelectedListener 列表项选中事件;(不使用) 2,OnItemClickListener 列表项点击事件; 3,OnItemLongClickListener 列表项长按事件; 2. 列表点击事件
效果图
3. 列表项长按事件
效果图
以下是我们的源代码 main.xml <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="@string/qq" />
<ListView
android:id="@+id/qqf"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
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:orientation="vertical"
此处我们隐掉这句,采用它的默认水平布局方式-->
<!-- 模拟qq列表,显示用户头像 -->
<ImageView
android:id="@+id/pic"
android:paddingBottom="5dp"
android:contentDescription="@string/pic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/nickName"
android:paddingTop="5dp"
android:paddingLeft="5dp"
android:textStyle="bold"
android:paddingBottom="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/msg"
android:paddingLeft="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">SimpleAdapterDemo</string>
<string name="pic">头像</string>
<string name="qq">QQ好友列表</string>
</resources>
SimpleAdapterDemoActivity.java
package com.ktt.adapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class SimpleAdapterDemoActivity extends Activity {
/** Called when the activity is first created. */
//1.首先,定义一个二位数组,存放信息,此处存放昵称和msg
private String data[][]=new String[][]{
{String.valueOf(R.drawable.a),"花样美男","安静的美男子。。。"},
{String.valueOf(R.drawable.b),"阿哩姐姐","我想要飞翔。。。"},
{String.valueOf(R.drawable.c),"大笨熊","就是这么任性。。。"},
{String.valueOf(R.drawable.d),"水旺旺","萌死你们。。。"},
{String.valueOf(R.drawable.e),"疯狂的汽车","让你心花路放。。。"}
};
//2.接着,我们需要定义一个封装数据的Map集合
private List<Map<String,String>> qqList = new ArrayList<Map<String,String>>();
//3.写一个ListView组件,再定义一个简单适配器
private ListView qqListView = null;
private SimpleAdapter simpleAdapter = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//4.获取ListView控件
this.qqListView = (ListView) super.findViewById(R.id.qqf);
//5.给qqList封装数据
for(int i=0;i<this.data.length;i++){
Map<String,String> qq = new HashMap<String,String>();
//注意:Map中的Key值,Value值,Key值要与模板item中对应的id值一致
qq.put("pic", data[i][0]);
qq.put("nickName", data[i][1]);
qq.put("msg", data[i][2]);
this.qqList.add(qq);
}
//6.初始化一个SimpleAdapter
/*
* 初始化数据含义
1.context SimpleAdapter关联的View的运行环境 (this)当前上下文
2.data 一个Map组成的List。在列表中的每个条目对应列表中的一行,
每一个map中应该包含所有在from参数中指定的键 (this.qqList) qq列表数据
resource 一个定义列表项的布局文件的资源ID。
布局文件将至少应包含那些在to中定义了的ID (R.layout.item)模板
from 一个将被添加到Map映射上的键名 (集合对应显示数据)
to 将绑定数据的视图的ID,跟from参数对应,这些应该全是TextView (模板对应显示数据)
*/
this.simpleAdapter = new SimpleAdapter(this,
this.qqList,
R.layout.item,
new String[]{"pic","nickName","msg"},
new int[]{R.id.pic,R.id.nickName,R.id.msg});
//7.给qqListView设置适配器,设置后才会有数据
this.qqListView.setAdapter(this.simpleAdapter);
this.qqListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
Map<String,String> map=(Map<String, String>) simpleAdapter.getItem(position);
Toast.makeText(SimpleAdapterDemoActivity.this,"被点击的好友是:"+map.get("nickName"), Toast.LENGTH_SHORT).show();
}
});
this.qqListView.setOnItemLongClickListener(new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
Map<String,String> map=(Map<String, String>) simpleAdapter.getItem(position);
Toast.makeText(SimpleAdapterDemoActivity.this,"被长按的好友是:"+map.get("nickName"), Toast.LENGTH_SHORT).show();
return false;
}
});
this.qqListView.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
}
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
}
});
}
}
当然,相似的我们可以做如下时间
1.模拟音乐/视频播放列表
2.模拟图书菜单等
本项目案例来自:www.java1234.com
推荐大家进去学习