Android之Adapter系列之SimpleAdapter类
16lz
2021-01-23
SimpleAdapter继承了BaseAdapter,作为一个Adapter的简单实现,SimpleAdapter支持的控件也比较少:checkable控件(例如checkbox,radioButton)、TextView和ImageView。
源码部分
源码路径:framework\base\core\java\android\widget\SimpleAdapter.java
package android.widget;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.view.LayoutInflater;import android.net.Uri;import java.util.ArrayList;import java.util.List;import java.util.Map;/** * SimpleAdapter是一个将静态数据映射到在xml中定义的View上的简单的adapter。 * 开发者将数据保存在一个包含maps的ArrayList中。Arraylist中的每一项数据和view * 中的每一个项对应。map中包含了view中每一行的数据。同样,开发者可以指定xml文件 * 来显示map中对应行的数据或者用map中的keys值来指定view。 * * 数据的绑定发生在一下两种情况。 * 首先,如果{@link android.widget.SimpleAdapter.ViewBinder} 可见, * {@link ViewBinder#setViewValue(android.view.View, Object, String)}被调用。 * 如果setViewValue返回true,那么则进行数据绑定。如果返回false,那么下面这些 * 情况将按顺序尝试执行 * * - 如果View实现了Checkable(例如Checkbox),那么返回值将是boolean类型 *
- TextView 返回值为String并且 {@link #setViewText(TextView, String)}将被调用 *
- ImageView 返回值为资源id或者string,并且{@link #setViewImage(ImageView, int)} * 或者 {@link #setViewImage(ImageView, String)} 被调用 *
* 如果没有合适的binding返回,将会抛出 {@link IllegalStateException}异常 */ public class SimpleAdapter extends BaseAdapter implements Filterable { private int[] mTo; private String[] mFrom; private ViewBinder mViewBinder; private List<? extends Map> mData; private int mResource; private int mDropDownResource; private LayoutInflater mInflater; private SimpleFilter mFilter; private ArrayList
事例部分
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
SimpleAdapter中包含了一个Interface ViewBinder,这里分两种情况,分别介绍两个事例,第一个,不使用ViewBinder;第二个,使用ViewBinder
SimpleAdapterNoBinder.javapackage com.lj.simpleadaptertest;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Random;import android.app.Activity;import android.os.Bundle;import android.widget.ListView;import android.widget.SimpleAdapter;public class SimpleAdapterNoBinder extends Activity {ListView mListView;List> mData = new ArrayList>();public static final String KEY_IMG = "imgage";public static final String KEY_TITLE = "title";public static final String KEY_SUMMARY = "summary";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_no_binder);mListView = (ListView) findViewById(R.id.list_no_binder); //定义一个mAdapter,设置自定义的layout布局,调用getData返回需要显示的数据SimpleAdapter mAdapter = new SimpleAdapter(this, getData(),R.layout.list_item, new String[] { KEY_IMG, KEY_TITLE,KEY_SUMMARY, }, new int[] { R.id.image, R.id.title,R.id.summary });mListView.setAdapter(mAdapter);} //map中包含三部分数据,ImageView设置为默认的R.drawable.ic_launcher,两个TextView设置为随机的字符private List> getData() {List> list = new ArrayList>();Map map;for (int i = 0; i < 30; i++) {map = new HashMap();map.put(KEY_IMG, R.drawable.ic_launcher);map.put(KEY_TITLE, getTitleText(8));map.put(KEY_SUMMARY, getTitleText(10));list.add(map);}return list;}private Object getTitleText(int length) {String mString = "qwertyuiopasdfghjklzxcvbnm";Random random = new Random();StringBuffer sb = new StringBuffer();for (int i = 0; i < length; i++) {int number = random.nextInt(mString.length());sb.append(mString.charAt(number));}return sb.toString();}}
SimpleAdapterWithBinder.java package com.lj.simpleadaptertest;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Random;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Color;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.ImageView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.TextView;public class SimpleAdapterWithBinder extends Activity {ListView mListView;List> mData = new ArrayList>();public static final String KEY_IMG = "imgage";public static final String KEY_TITLE = "title";public static final String KEY_SUMMARY = "summary";public static final String KEY_CHECK = "check";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_no_binder);mListView = (ListView) findViewById(R.id.list_no_binder);SimpleAdapter mAdapter = new SimpleAdapter(this, getData(),R.layout.list_item, new String[] { KEY_IMG, KEY_TITLE,KEY_SUMMARY, }, new int[] { R.id.image, R.id.title,R.id.summary });mAdapter.setViewBinder(new TestViewBinder());mListView.setAdapter(mAdapter);}private List> getData() {List> list = new ArrayList>();Map map;for (int i = 0; i < 30; i++) {map = new HashMap();map.put(KEY_IMG, R.drawable.ic_launcher);map.put(KEY_TITLE, getTitleText(8));map.put(KEY_SUMMARY, getTitleText(10));map.put(KEY_CHECK, (i / 2 == 0 ? true : false));list.add(map);}return list;}private Object getTitleText(int length) {String mString = "qwertyuiopasdfghjklzxcvbnm";Random random = new Random();StringBuffer sb = new StringBuffer();for (int i = 0; i < length; i++) {int number = random.nextInt(mString.length());sb.append(mString.charAt(number));}return sb.toString();}public Bitmap getBitmap(final String url) {Log.e("lijian", "url = " + url);Bitmap bmp = null;try {URL mUrl = new URL(url);HttpURLConnection conn = (HttpURLConnection) mUrl.openConnection();InputStream is = conn.getInputStream();bmp = BitmapFactory.decodeStream(is);} catch (Exception e) {e.printStackTrace();}return bmp;}/** * 实现ViewBinder接口 * */class TestViewBinder implements SimpleAdapter.ViewBinder {@Overridepublic boolean setViewValue(View view, Object data,String textRepresentation) {if ((view instanceof ImageView)) {Log.e("lijian", "set internet image data " + data);ImageView mImageView = (ImageView) view;mImageView.setImageResource(R.drawable.error);return true;} else if (view instanceof TextView && view.getId() ==R.id.summary) {TextView mTextView = (TextView) view;mTextView.setText("你好");return true;}return false;}}}
效果图:
图 1
图二
事例总结
图片以和图片二分别代表不使用ViewBinder和使用ViewBinder的结果,每一个Item的图片和summary字符可以在ViewBinder实现的类中的setViewValue中修改。
源码下载
更多相关文章
- Java乔晓松-android的四大组件之一Service(服务的绑定)
- android之网络请求 -- 获取RecyclerView的列表项(图片 + 文字)
- Android系列之Post图片和数据
- Android查询短信数据库
- Android应用程序的Java数据更新和UI同步改变
- android 开发之activity之间传递数据
- Android之Activity之间的数据通信方式大全(二)
- Android——横竖屏切换以及数据保存
- Android数据存取之Preferences