前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2014-10-25Android学习--------SimpleAdapter的实现

2014-10-25Android学习--------SimpleAdapter的实现

作者头像
wust小吴
发布2022-03-07 08:27:16
3590
发布2022-03-07 08:27:16
举报
文章被收录于专栏:风吹杨柳

我学习Android都是结合源代码去学习,这样比较直观,非常清楚的看清效果,觉得很好,今天的学习源码是网上找的个HealthFood 源码 百度搜就知道很多下载的地方

本篇学习需要结合前面写的几篇文章,特别是关于布局学习(三) 地址:http://blog.csdn.net/u014737138/article/details/40480291

如何要对ListView进行数据绑定,必须使用到一个接口:Adapter。

其中最经常与ListView进行配合使用的有ArrayAdapter、 CursorAdapter及SimpleAdapter等。

从名称可以看出ArrayAdapter使用的是一个ArrayAdapter做为数据源,SimpleCursorAdapter使用的是一个Cursor使用数据源,都比较容易理解,那么如何使用SimpleAdapter作为数据的适配器呢。

首先看下源代码:

代码语言:javascript
复制
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.list);
		
		List<Map<String, Object>> lists = new ArrayList<Map<String, Object>>();
		for (int i = 0; i < resId.length; i++) {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("ImageView01", resId[i]);
			map.put("TextView01", food[i]);
			map.put("TextView02", food1[i]);
            lists.add(map);
		}
		
		SimpleAdapter adapter = new SimpleAdapter(this, lists, R.layout.list_view_row, new String[]{"ImageView01","TextView01", "TextView02"}, new int[]{R.id.ImageView01, R.id.TextView01, R.id.TextView02});
		
		setListAdapter(adapter);
		
		listView = this.getListView();
		listView.setOnItemClickListener(this);
		
	}


	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
		// TODO Auto-generated method stub
		List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();
		for (int j = 0; j < efood.length; j++) {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put(efood[j], efoodinfo[j]);
			data.add(map);
		}
		
		Intent intent = new Intent();
		intent.setClass(FoodListView.this, FoodInfo.class);
		intent.putExtra("drawable", resId[position]);
		intent.putExtra("foodname", food[position]);
		intent.putExtra("efoodnema", food1[position]);
		intent.putExtra("foodinfo", foodjianjie[position]);
		startActivity(intent);

	}  

首先这个activity是继承ListActivity的:public class FoodListView extends ListActivity implements OnItemClickListener

它实现OnItemClickListener 是因为它采用了这种监听事件的方法:

代码语言:javascript
复制
listView.setOnItemClickListener(this);

code:listView = this.getListView();//注意到这里的listView不是通过this.findViewByID得到控件对象的,而是系统自己本身就可以找到这个控件,所以这里要求的就是setContentView(R.layout.list);这行代码对应的list.xml文件只有一个ListView控件,唯一一个

接下来我们看看构造函数:SimpleAdapter(this, lists, R.layout.list_view_row, new String[]{"ImageView01","TextView01", "TextView02"}, new int[]{R.id.ImageView01, R.id.TextView01, R.id.TextView02});

android. widget. SimpleAdapter.SimpleAdapter Public Constructors public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) Parameters context:The context where the View associated with this SimpleAdapter is running 当前正在运行的activity上下文,并且它与适配的视图有关 data: A List of Maps. Each entry in the List corresponds to one row in the list. 数组的每一个实体对象跟list中的每一行需要相匹配的 The Maps contain the data for each row, [map]中包含listView控件每一行所需要的数据 and should include all the entries specified in "from" //data中应该包含所有的在参数“form”具体的实例对象 resource: Resource identifier of a view layout that defines the views for this list item.//定义的布局文件的id号,这个布局文件定义了 ListView控 件的每一行 The layout file should include at least those named views defined in "to"//并且这个布局文件中必须包含int[]数组参数中所代表的所有 元素与之对应的子控件id号 from: A list of column names that will be added to the Map associated with each item.//一个数组,这个数组里面的内容与ListView的每一 行的值相关的,有联系的 to: The views that should display column in the "from" parameter. 视图布局文件中应该显示from参数对应的个数的id号, These should all be TextViews. 这些值代表的应该都是TextView类型的控件 The first N views in this list are given the values of the first N columns in the from parameter.一 一 对应 其实说简单一点:from 和 to 两个数组参数,个数是一样的,即数组的长度相同,int[]数组里面各个元素值是item布局文件中含有的所有的id号 from[]数组里面的元素是int[]数组元素相对应的id所代表的控件的内容,resource代表的是item布局文件的资源id号,在R.java 中可以找到。context代表上下文,也就是当前的activity代表的上下文,this。data代表一个实体对象类的数组。这个数组里面放着 的内容就是String数组里面的所有元素对应的键值,并且给这些键值一个value值。 那么现在我们看下代码中是怎么做的: SimpleAdapter adapter = new SimpleAdapter(this, lists, R.layout.list_view_row, new String[]{"ImageView01","TextView01", "TextView02"}, new int[]{R.id.ImageView01, R.id.TextView01, R.id.TextView02}); this:代表的当前的FoodListView activity类 lists申明是:List<Map<String, Object>> lists = new ArrayList<Map<String, Object>>(); 它是一个数组,数组元素是一个Map对象,Map对象里面放置的是一个Stirng键值+Object值对 它与 List<? extends Map<String, ?>> 要求是一致的 R.layout.list_view_row:它是一个布局文件的id号, new String[]{"ImageView01","TextView01", "TextView02"}:from参数数组里面放置的是三个元素:图片视图,文本视图,文本视图的id号 int[]{R.id.ImageView01, R.id.TextView01, R.id.TextView02}:int参数数组里面放置的是从资源文件中获得的,项目中所有资源的索引id,他们分别对应着from参数 接下来我们再去看看lists是怎么初始化的: for (int i = 0; i < resId.length; i++) {//resId是什么?它是所有要显示的食物图片的名称id组成的数组 Map<String, Object> map = new HashMap<String, Object>();//申明一个map对象 map.put("ImageView01", resId[i]);//向map里面放值,第一个键值为ImageView01,它的值为 resId[i]. map.put("TextView01", food[i]);//向map里面放值,第二个键值为TextView01,它的值为 food[i]. map.put("TextView02", food1[i]);//向map里面放值,第三个键值为TextView02,它的值为 food1[i]. lists.add(map);//然后将map加到lists数组里面 } 看看resId的初始化: private static final int[] resId = { R.drawable.pork, R.drawable.pigliver, R.drawable.pigblood, R.drawable.lamb, R.drawable.beef, R.drawable.beefliver, R.drawable.goose, R.drawable.rabbit, R.drawable.dog, R.drawable.duck, R.drawable.chicken, R.drawable.donkey, R.drawable.egg, R.drawable.carp, R.drawable.yellowfish, R.drawable.shrimp, R.drawable.shrimp2, R.drawable.crab, R.drawable.clam, R.drawable.turtle, R.drawable.riversnail, R.drawable.garlic, R.drawable.onion, R.drawable.radish, R.drawable.celery, R.drawable.leek, R.drawable.spinach, R.drawable.lettuce, R.drawable.bamboo, R.drawable.tomato, R.drawable.foreignonion, R.drawable.vinegar, R.drawable.tea, R.drawable.beanmilk, R.drawable.brownsuger, R.drawable.honey, R.drawable.milk, R.drawable.whitespirit, R.drawable.beer }; 它就是代表我们要显示的所有的图片,也就ListView每一行要放置的图片,resId[i]就代表着每一行的图片 这个图片我们把它放在一个map对象里面,给它设置的键值为: map.put("ImageView01", resId[i]);,也就是说通过ImageView01键值取出来的东西就是我们要显示的图片,只不过这个东西代表的是图片资源的id索引号。 那么ListView每一行要放置的除了图片之外,还有两个文本,这个可以从页面效果上面看出来, 所以这个时候我们需要把那两个文本也需要加到map对象中去,所以就有这样的设置: map.put("TextView01", food[i]);//也就是说通过TextView01键值取出来的值就是我们要显示的第一个文本框的内容 map.put("TextView02", food1[i]);也就是说通过TextView02键值取出来的值就是我们要显示的第二个文本框的内容 那么接下来又对food[i[]和food1[i]初始化即可: private static final String[] food = { "猪肉", "猪肝", "猪血", "羊肉", "牛肉", "牛肝", "鹅肉", "兔肉", "狗肉", "鸭肉", "鸡肉", "驴肉", "鸡蛋", "鲤鱼", "黄鱼", "虾", "虾皮", "螃蟹", "蛤", "鳖肉", "田螺", "大蒜", "葱", "萝卜", "芹菜", "韭菜", "菠菜", "莴笋", "竹笋", "西红柿", "洋葱", "醋", "茶", "豆浆", "红糖", "蜂蜜", "牛奶", "白酒", "啤酒" }; 每一个food[i]对应的元素必须要与resId[i]保持一致,同理food1也是一样的,这里就不介绍了 只不过这里需要注意的是:这种写法不好,应该初始化是需要去解析xml文件最好, 到这里我们的SimpleAdapter就构造成功了,接下来就是激活它,只需要一行代码就可以: setListAdapter(adapter); 这行代码就是对ListView控件进行事件的匹配, 再调用监听事件: listView.setOnItemClickListener(this);去实现它未实现的方法就可以了: @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();// for (int j = 0; j < efood.length; j++) { Map<String, Object> map = new HashMap<String, Object>(); map.put(efood[j], efoodinfo[j]); data.add(map); } Intent intent = new Intent(); intent.setClass(FoodListView.this, FoodInfo.class); intent.putExtra("drawable", resId[position]); intent.putExtra("foodname", food[position]); intent.putExtra("efoodnema", food1[position]); intent.putExtra("foodinfo", foodjianjie[position]); startActivity(intent); } 这个函数在的作用再下节里面再讲, 到此,ListView布局就成功实现了。

主要使用的方法上就是SimpleAdapter

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档