Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android探秘:SimpleAdapter與Bitmap的結合

Android探秘:SimpleAdapter與Bitmap的結合

編輯:關於Android編程

首先我們知道,在Android中,Adapter本身是一個接口,他 派生了很多子接口,這些子接口又被很多具體的類實現,來實現具體的顯示效果。本次我們主要介紹的是SimpleAdapter實現類。

SimpleAdapter類:實際上SimpleAdapter並不簡單,而且他的功能非常強大,可以將List集合的多個對象封裝成列表項。

這就是我們經常需要用到的功能。例如:我們在手機上顯示東西的時候,每一個Item都會有 id、title、description、image之類的attribute,顯然是多個attribute,我們如何將這多個Item綁定來顯示在一個Item上面,這個就是我們要深入研究SimpleAdapter的原因。

下面看SimpleAdapter一個重要的構造函數:

 

公有構造函數

public SimpleAdapter (Context context, List> 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 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> listItems = new ArrayList>();
		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 listItem = new HashMap();
			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 });
		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;
			}
		});
		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文件如下:

 

 
    


/res/layout/template.xml文件如下:

 

 

上面的顯示效果如下:

 

 

\

上面顯示的在運行的時候綁定Bitmap。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved