Android探秘:SimpleAdapter与Bitmap的结合

首先我们知道,在Android中,Adapter本身是一个接口,他 派生了很多子接口,这些子接口又被很多具体的类实现,来实现具体的显示效果。本次我们主要介绍的是SimpleAdapter实现类。

SimpleAdapter类:实际上SimpleAdapter并不简单,而且他的功能非常强大,可以将List集合的多个对象封装成列表项。

这就是我们经常需要用到的功能。例如:我们在手机上显示东西的时候,每一个Item都会有 id、title、description、image之类的attribute,显然是多个attribute,我们如何将这多个Item绑定来显示在一个Item上面,这个就是我们要深入研究SimpleAdapter的原因。

下面看SimpleAdapter一个重要的构造函数:

公有构造函数

public SimpleAdapter (Context context, List<? extends Map<String, ?>>
data, int resource, String[] from, int[] to)

构造函数

参数
context 与 SimpleAdapter 关联的运行着的视图的上下文.
data Map 的列表.列表中的每个条目对应一行.Maps 中包含所有在 from 中指定的数据.
resource 定义列表项目的视图布局的资源 ID.布局文件至少应该包含在 to 中定义了的名称.
from 与 Map 中的项目建立关联的列名的列表.
to 用于显示 from 中参数中的列的视图列表.这些视图应该都是 TextView 类型的. 该列表中的第 N 个视图显示从参数 from 中的第 N 列获取的值.

但是一般情况下,我们发现image都是存放在Android自身的project里面的drawable或者/res/raw文件夹里面的,也就是刚刚开始的时候已经指定了,这时候这些图片就会映射到R.java文件中,并以int的形式保存起来,那么在调用的时候当然可以使用int类型了。

但是如果我们在开始的时候并不是直接在Android的project设置这些image的话,一个显然的问题就出现了:由于不是事先在project设置的,这些image就不定自动导入到R.java文件中,当然也就不会以int类型保存了,那么此时这个函数怎么使用了。

下面我们就使用SimpleAdapter的嵌套类——SimpleAdapter.ViewBinder

该类用于 SimpleAdapter 的外部客户将适配器的值绑定到视图. 你可以使用此类将 SimpleAdapter 不支持的值绑定到视图,或者改变 SimpleAdapter 支持的视图的绑定方式.

公有方法
abstract boolean setViewValue(View view, Object data, String textRepresentation)

绑定指定的数据到指定的视图.

那么下面我们就可以这样使用SimpleAdapter的这个嵌套类来实现这个特定的功能了。

public void showDialog(Context context, final String template, int mode) {
		ArrayList<String> templateList = getTemplateList(template, mode);
		LayoutInflater inflater = LayoutInflater.from(context);
		final View dialog = inflater.inflate(R.layout.template, null);
		ListView listView = (ListView) dialog.findViewById(R.id.mylist);
		final List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
		final AlertDialog.Builder builder = new AlertDialog.Builder(context);
		MTemplateProcessor processor = new MTemplateProcessor();

		for (int i = 0; i < templateList.size(); ++i) {
			try {
				processor.init(MainActivity.s_Engine.getThemePath()
						+ templateList.get(i));
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			Map<String, Object> listItem = new HashMap<String, Object>();
			listItem.put("id", templateList.get(i));
			listItem.put("title", processor
					.getTitle(MTemplateProcessor.LANGUAGE_CODE_ENGLISH));
			listItem.put("description", processor
					.getDescription(MTemplateProcessor.LANGUAGE_CODE_ENGLISH));
			MBitmap mBitmap = processor.getThumbnail(MainActivity.s_Engine,
					MColorSpace.MPAF_RGB32_B8G8R8A8, 128, 64);
			if (mBitmap != null) {

				Bitmap bitmap = MAndroidBitmapFactory.createBitmapFromMBitmap(
						mBitmap, false);
				listItem.put("thumbnail", bitmap);
				try {
					processor.freeThumbnail(mBitmap);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

			listItems.add(listItem);
			try {
				processor.unInit();
			} catch (Exception e) {
				// TODO: handle exception
			}

		}

		SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,
				R.layout.dialog_layout, new String[] { "title", "description",
						"thumbnail" }, new int[] { R.id.title,
						R.id.description, R.id.thumbnail });
		<span style="color:#ff0000;"><em>simpleAdapter.setViewBinder(new ViewBinder() {

			@Override
			public boolean setViewValue(View view, Object data, String arg2) {
				// TODO Auto-generated method stub
				if ((view instanceof ImageView) && (data instanceof Bitmap)) {
					ImageView imageView = (ImageView) view;
					Bitmap bitmap = (Bitmap) data;
					imageView.setImageBitmap(bitmap);
					return true;
				}
				return false;
			}
		});</em></span>
		listView.setAdapter(simpleAdapter);
		listView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1,
					int position, long arg3) {
				// TODO Auto-generated method stub
				String templateString = MainActivity.s_Engine.getThemePath()
						+ listItems.get(position).get("id").toString();
				if (template.equals("transition"))
					addTransition(templateString);
				if (template.equals("effect"))
					addEffect(templateString);
			}
		});
		if (template.equals("transition"))
			builder.setTitle("Select Transition");
		if (template.equals("effect"))
			builder.setTitle("Select Effect");
		builder.setView(dialog);
		builder.show();
	}

/res/layout/dialog_layout.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" >

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#f00" />

    <TextView
        android:id="@+id/description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#0f0" />

    <ImageView
        android:id="@+id/thumbnail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

/res/layout/template.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" >

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#f00" />

    <TextView
        android:id="@+id/description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#0f0" />

    <ImageView
        android:id="@+id/thumbnail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

上面的显示效果如下:

上面显示的在运行的时候绑定Bitmap。

时间: 2024-10-07 06:09:48

Android探秘:SimpleAdapter与Bitmap的结合的相关文章

学习Android之SimpleAdapter显示网络图片

效果图: 此程序主要的知识点是:SimpleAdapter本身是不支持网络图片的, 如果在Map.put(a,b)中 b为一个Bitmap,程序不会报红色字体,而是在控制台输出绿色的字体,如下 05-10 15:46:45.474: I/System.out(846): resolveUri failed on bad bitmap uri: [email protected] 要想实现显示网络图片其实很简单,使用SimpleAdapter中的方法simpleAdapter.setViewBin

android 适配器simpleadapter和baseadapter区别

android 适配器 simpleadapter 和 baseadapter 设计网络程序或者数据处理显示程序的时候,常常会使用 simpleadapter 和baseadapter 来实现. adapter 是适配器模式,是数据和界面之间的桥梁.baseadapter 是一个抽象的类,要使用必需为其定义子类并实现相关方法.simpleadapter 派生于 baseadapter ,已经实现了相关的方法,所以可以直接使用.二者在使用效果上没有太大的区别,两者可以设计出几乎一模一样的界面.但在

android中SimpleAdapter

代码: import android.app.Activity;import android.os.Bundle;import android.widget.ListView;import android.widget.SimpleAdapter; import java.util.*; public class MainActivity extends Activity { private String[] names=new String[]{ "虎头","弄玉"

Android两种旋转Bitmap方法比较

方法1. 利用Bitmap.createBitmap Bitmap adjustPhotoRotation(Bitmap bm, final int orientationDegree) { Matrix m = new Matrix(); m.setRotate(orientationDegree, ( float ) bm.getWidth() / 2, ( float ) bm.getHeight() / 2); try { Bitmap bm1 = Bitmap.createBitmap

android ListView SimpleAdapter 带图片

main.xml <RelativeLayout 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:

Android 一张图片(BitMap)占用内存的计算 图片内存优化

在Android开发中,我现在发现很多人还不会对图片占用内存进行很好的计算. 因此撰写该博文来做介绍,期望达到抛砖引玉的作用. Android中一张图片(BitMap)占用的内存主要和以下几个因数有关:图片长度,图片宽度,单位像素占用的字节数. 一张图片(BitMap)占用的内存=图片长度*图片宽度*单位像素占用的字节数 注:图片长度和图片宽度的单位是像素. 图片(BitMap)占用的内存应该和屏幕密度(Density)无关,虽然我暂时还拿不出直接证据. 创建一个BitMap时,其单位像素占用的

Android -- ListView(SimpleAdapter) 自定义适配器

2.  代码 MainActivity package com.himi; 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.AdapterVie

Android有效的处理Bitmap,减少内存

Android有效的处理Bitmap,减少内存 图片可能会有不同的大小.在许多情况下,图片的大小会超出我们需要的大小.例如,我们的Camera应用,我们所拍的照片的大小远大于屏幕显示的大小 假如你的应用被限制了内存使用,显而易见,你会选择加载一个低分辨率的图片.这张低分辨率的图片应该匹配屏幕的尺寸.更高分辨率的图像没有提供任何可见的好处,但仍占用宝贵的内存,而且由于额外的动态缩放,会带来额外的性能开销. 本篇文章教你通过加载一个小尺寸的图片样本,来修饰一张大图,并且没有超过应用的内存限制. 原文

Android中常用的bitmap处理方法

收集了很多bitmap相关的处理方法,几乎全部应用在项目中,所以特记录下! package com.tmacsky.utils; import java.io.ByteArrayOutputStream; import java.io.IOException; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.gr