当前位置: 代码迷 >> Android >> Android 适配器课程(三)
  详细解决方案

Android 适配器课程(三)

热度:13   发布时间:2016-04-28 04:33:43.0
Android 适配器教程(三)

前两讲中,我们分别大体的了解了适配器是什么,和它的一些基本知识。

并且分别讲解了了ArrayAdapterSimpleCursorAdapter这两种常用的安卓原生适配器,这两种适配器都是封装好了的,他们虽然使用起来非常简单,但是可扩展性较差。


现在我们继续向下深入学习安卓的适配器,这一次我们将会一同学习SimpleAdapter

simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等,当然也有它做不到的事情,这些我们后来再说。

tip:有些代码继承了ListActivity,ListActivity和普通的Activity没有太大的差别,不同就是对显示ListView做了许多优化,方面显示而已。我们还是继承自普通的Activity。


下面我们要写的实例程序是实现一个带有图片的类表。当然会用上SimpleAdapter


程序开始!


(1)也还是先在activity_main.xml里添加一个button,一会跳转的时候使用。

(2)然后新建一个类SimpleAdapterDemo继承自Activity作为我们第三个例子的Activity,@Override 我们的onCreate方法。

(3)新建一个xml文件simpleadapterdemo.xml作为我们的布局文件,其中也是包含一个文本域和一个ListView:

代码如下:

simpleadapterdemo.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" >    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="这是simpleadapter的一个例子" >    </TextView>    <ListView        android:id="@+id/simpleadapterdemolistview"        android:layout_width="wrap_content"        android:layout_height="wrap_content" >    </ListView></LinearLayout>

注意啦!这里和前两次可有区别啦:

(4)我们需要定义好一个用来显示每一个列内容的xml

listitem1.xml 包含横向的图片与文字,这里可扩展性就体现出来了哦!

我们完全可以定义每一列的内容了,比如我可以让每一列都是图片并在图片下面加文字。

代码如下:

listitem1.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" >        <ImageView android:id="@+id/imgview1" 		android:layout_width="wrap_content"		android:layout_height="wrap_content" 		android:layout_margin="5px"/>        <TextView android:id="@+id/text1" 			android:layout_width="wrap_content"			android:layout_height="wrap_content" 			android:textColor="#000000"			android:textSize="22px" 			android:layout_margin="5px"/>        <TextView android:id="@+id/text2" 			android:layout_width="wrap_content"			android:layout_height="wrap_content" 			android:textColor="#000000"			android:textSize="15px" 			android:layout_margin="5px"/></LinearLayout>

(5)还是再回到SimpleAdapterDemo,定义一个Listview暂且叫做lv,并使用刚才的ID,setContentView()为刚才的xml布局,然后为lv设置一个适配器:

 

使用simpleAdapter的数据用一般都是HashMap构成的Listlist的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局listitem1.xml

下面做适配,new一个SimpleAdapter

SimpleAdapter adapter = new SimpleAdapter(this,data,resource,from, to);

参数依次是:thisHashMap title info,布局文件(listitem1.xml),至于from和to,有木有很熟悉,对我们上一篇刚刚使用过了From是你查询出的数据,to是单行布局中的单独控件,一对一的关系,用起来非常方便。布局文件的各组件分别映射到HashMap的各元素上,完成适配。


下面是具体代码:


 

package com.example.adapterdemo;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.widget.ListView;import android.widget.SimpleAdapter;public class SimpleAdapterDemo extends Activity {	private ListView lv;	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.simpleadapterdemo);		lv = (ListView) findViewById(R.id.simpleadapterdemolistview);		SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.listitem1,				new String[] { "text1", "text2", "img" }, new int[] {						R.id.text1, R.id.text2, R.id.imgview1});		lv.setAdapter(adapter);	}		public  List<Map<String, Object>> getData(){		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();		Map<String, Object> map = new HashMap<String, Object>();		map.put("text1", "Image1");		map.put("text2", "info1");		map.put("img", R.drawable.ic_launcher);		list.add(map);		map = new HashMap<String, Object>();		map.put("text1", "Image2");		map.put("text2", "info2");		map.put("img", R.drawable.ic_launcher);		list.add(map);		map = new HashMap<String, Object>();		map.put("text1", "Image3");		map.put("text2", "info3");		map.put("img", R.drawable.ic_launcher);		list.add(map);				map = new HashMap<String, Object>();		map.put("text1", "Image4");		map.put("text2", "info4");		map.put("img", R.drawable.ic_launcher);		list.add(map);		map = new HashMap<String, Object>();		map.put("text1", "Image5");		map.put("text2", "info5");		map.put("img", R.drawable.ic_launcher);		list.add(map);				map = new HashMap<String, Object>();		map.put("text1", "Image6");		map.put("text2", "info6");		map.put("img", R.drawable.ic_launcher);		list.add(map);				map = new HashMap<String, Object>();		map.put("text1", "Image7");		map.put("text2", "info7");		map.put("img", R.drawable.ic_launcher);		list.add(map);				map = new HashMap<String, Object>();		map.put("text1", "Image8");		map.put("text2", "info8");		map.put("img", R.drawable.ic_launcher);		list.add(map);		return list;					}}

最后又是看结果的时候了:

效果图:



这样三种常用的安卓原生适配器就算讲完了,随着一步步的学习,相信大家对适配器的使用已经比较有心得了。大家有没有发现我们所使用的适配器威力越来越大,当然实现过程也更加繁琐一些。


还有一些安卓的原生适配器,我们就杀鸡儆猴的学习了用的最多的三个原生适配器,其他的也就是小菜了,接下来我们就要自定义适配器了,自定义的适配器能适应更多的情况,功能更加强大,当然也需要我们更加深入的学习才能应用自如,请大家不要错过哦!


源码我会在最后一篇写完的时候一并上传,以内我也是边写博客边写代码,这样我觉得思路清晰一些。


我也是学生,水平有限,还请多多指教~


  相关解决方案