第十五讲-----SimpleAdapter 封装复杂数据,ListActivity 类,ListView 事件,自动文本提示组件 AutoCompleteTextView

本文详细讲解如何在Android开发中使用SimpleAdapter来封装数据,结合ListActivity展示列表,并探讨ListView的事件监听以及如何实现自动文本提示组件AutoCompleteTextView的功能。通过context、data、resource和from/to参数配置,实现数据与UI的绑定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
推荐大家进去学习





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值