作为一名编程初学者,我总是认为自己什么都不会,什么都不行,就算实现了文档指定的功能,我永远都是觉得自己写过的代码实在是太烂了,它只是恰巧能够运行而已!它只是在运行的时候恰巧没有发现错误而已!!一直都是抱着这样的念头,但迫于工作进度以及工作心情(这点必须承认,被上头追着进度的感觉让人很郁闷),在项目完结的一段时间内都不想看到自己的代码!!所以,迫切提醒各位和我一样的菜鸟,不要放过每一次重构和优化的机会,这种优化可以是小步骤的,有时就是代码结构的一个优化,或者是某个变量名的修改,并不要求我们从一开始就对结构进行优化,记住这句话:

程序员只要对自己的代码负责就行。

自己写过的代码迟早是要被人看的,被人用的,所以,它就像是我们在这圈子里的名片,无论我们把自己吹得再牛,一看我们的代码,就真的是什么馅都清楚了。所以,不要对自己正在写的代码马虎,最后吃亏的是自己。

在结束项目的某个进度后,就来写写博客转换一下心情,想起常用控件ListView,于是就来研究研究它。

使用ListView关键的就是适配器,可怕的是,用于ListView的适配器很多。

我们先从名字看似最简单其实不简单的SimpleAdapter开始。

我们先来看一个简单的例子:

    private ListView mListView;
private LinearLayout mLayout; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); mLayout = new LinearLayout(this);
mLayout.setOrientation(LinearLayout.VERTICAL);
mListView = new ListView(this);
LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
mLayout.addView(mListView, param);
setContentView(mLayout);
Map<String, String> keyValuePair = new HashMap<String, String>();
keyValuePair.put("Name", "小智");
keyValuePair.put("Age", "10");
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
list.add(keyValuePair); ListAdapter adapter = new SimpleAdapter(this, list,
android.R.layout.simple_list_item_2, new String[] { "Name",
"Age" }, new int[] { android.R.id.text1,
android.R.id.text2 }); mListView.setAdapter(adapter);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

我们先从SimpleAdapter的构造开始。
     要构造一个SimpleAdapter,需要以下的参数:

1.Context context:上下文,这个是每个组件都需要的,它指明了SimpleAdapter关联的View的运行环境,也就是我们当前的Activity。

2.List<? extends Map<String, ?>> data:这是一个由Map组成的List,在该List中的每个条目对应ListView的一行,每一个Map中包含的就是所有在from参数中指定的key。

3.int resource:定义列表项的布局文件的资源ID,该资源文件至少应该包含在to参数中定义的ID。

4.String[] from:将被添加到Map映射上的key。

5.int[] to:将绑定数据的视图的ID跟from参数对应,这些被绑定的视图元素应该全是TextView。

上面的例子中我们是手动的添加视图,然后使用的是系统默认的视图元素,像是android.R.id.text1。当然,我们也可以自定义TextView的样式,而且,说是应该全是TextView,也只是应该,并不是绝对的:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); ListView listView = (ListView) this.findViewById(R.id.list);
List<Map<String, ?>> list = new ArrayList<Map<String, ?>>();
for (int i = 0; i < 5; i++) {
Map<String, String> keyValuePair = new HashMap<String, String>();
keyValuePair.put("Text", "Text" + i);
keyValuePair.put("Button", "Button" + i);
list.add(keyValuePair);
} ListAdapter adapter = new SimpleAdapter(this, list, R.layout.listitem,
new String[] { "Text", "Button" }, new int[] { R.id.text,
R.id.button }); listView.setAdapter(adapter);

从这里我们可以看到,要想使用ListView,我们应用程序的主界面必须包含ListView,然后ListView的内容可以自己定义,而不仅仅是TextView。

要想知道这是什么回事,我们就要知道SimpleAdapter是如何绑定数据到视图的,这个过程我们甚至可以自定义:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); ListView listView = (ListView) this.findViewById(R.id.list);
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
for (int i = 0; i < 3; i++) {
Map<String, String> keyValuePair = new HashMap<String, String>();
keyValuePair.put("text", "text" + i);
list.add(keyValuePair);
} CustomSimpleAdapter adapter = new CustomSimpleAdapter(this, list,
R.layout.listitem); listView.setAdapter(adapter);
class CustomSimpleAdapter extends SimpleAdapter {
private int mResource;
private List<? extends Map<String, ?>> mData; public CustomSimpleAdapter(Context context,
List<? extends Map<String, ?>> data, int resource) {
super(context, data, resource, null, null);
this.mResource = resource;
this.mData = data;
} @Override
public View getView(int position, View convertView, ViewGroup group) {
LayoutInflater layoutInflater = getLayoutInflater();
View view = layoutInflater.inflate(mResource, null);
TextView text = (TextView) view.findViewById(R.id.text);
text.setText(mData.get(position).get("text").toString());
if (position == 2) {
text.setTextColor(Color.RED);
}
return view;
}
}

要想实现自定义的ListView,最主要的是实现getView(),因为SimpleAdapter的数据绑定就是发生在这里。
      现在我们可以总结一下SimpleAdapter的数据绑定是怎样的:利用传入的view(该view包含ListView每行要渲染的视图元素)的ResourceID得到该view,然后通过每个vie所在的索引,也就是它们的行数,得到data中相应内容的key,接着就是利用这些key的value填充这些视图元素,最后返回view作为ListView每行的内容显示出来。

由此可见,from和to并不是必须的,要想实现ListView,前三个参数才是必要的,也许大家会看到网上有些例子为了实现自定义的SimpleAdapter,会覆写它的许多方法,其实如果单纯只是想要利用SimpleAdapter来实现自定义的ListView,只要覆写getView()就行,其他的完全可以交给SimpleAdapter原先的方法来做,除非我们有特殊的要求。

SimpleAdapter并不仅仅用在ListView上,事实上,Spinner同样可以使用:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Spinner spinner = (Spinner) this.findViewById(R.id.spinner);
List<Map<String, ?>> list = new ArrayList<Map<String, ?>>();
for (int i = 0; i < 5; i++) {
Map<String, String> keyValuePair = new HashMap<String, String>();
keyValuePair.put("Text", "Text" + i);
list.add(keyValuePair);
} SimpleAdapter adapter = new SimpleAdapter(this, list,
R.layout.listitem, new String[] { "Text" },
new int[] { R.id.text }); spinner.setAdapter(adapter);
}

因为Spinner显示的列表本质上就是一个ListView,所以,和ListView有关的一切它几乎都可以使用,这个还是放在Spinner那时候再讲吧。
      原本只是想要将所有的适配器讲完,但碍于篇幅有限,所以只好分开讲,还有,SimpleCursorAdapter由于涉及到数据库,所以打算单独拿出来讲。

SimpleAdapter真不简单!的更多相关文章

  1. BaseAdapter,SimpleAdapter,CursorAdapter的用法

    简单好用的Adapter---ArrayAdapter ArrayAdapter是BaseAdapter的派生类,在BaseAdapter的基础上,添加了一项重大的功能:可以直接使用泛型构造. 我们先 ...

  2. 不简单的SQL查询和排序语句

    真不简单!! 一:使用select语句进行查询 语法: SELECT    <列名> FROM      <表名> [WHERE    <查询条件表达式>] [OR ...

  3. Redis 发布订阅,小功能大用处,真没那么废材!

    今天小黑哥来跟大家介绍一下 Redis 发布/订阅功能. 也许有的小伙伴对这个功能比较陌生,不太清楚这个功能是干什么的,没关系小黑哥先来举个例子. 假设我们有这么一个业务场景,在网站下单支付以后,需要 ...

  4. 推荐一篇关于java 学习的文章,感觉写的很不错

    ---恢复内容开始---    很多网友问我学习Java有没有什么捷径,我说"无他,唯手熟尔".但是我却很愿意将自己学习的一些经验写出来,以便后来者少走弯路,帮助别人是最大的快乐嘛 ...

  5. 疯狂Android讲义 - 学习笔记(二)

    Android应用的用户界面编程 2.1 界面编程与视图(View)组件 Android应用的绝大部分UI组件放在android.widget.android.view包及其子包中,所有UI组件都继承 ...

  6. 【原创】14. MYSQL++之SSQLS(原理解析)

    从之前所介绍的SSQLS的介绍中我们可以感受到,SSQLS的精髓应该在sql_create_#这个宏,他所创建出来的这个结构体将会是突破的关键,所以我将会从以下顺序入手. 1. sql_create_ ...

  7. [BZOJ 3622]已经没有什么好害怕的了

    世萌萌王都拿到了,已经没有什么好害怕的了——    (作死) 笑看哪里都有学姐,真是不知说什么好喵~ 话说此题是不是输 0 能骗不少分啊,不然若学姐赢了,那么有头的学姐还能叫学姐吗?  (作大死) 这 ...

  8. 想了解JAVA的,看看(转载)

    较新一篇 / 较旧一篇 编辑 |删除 | 复制链接  公开 想了解JAVA的,看看(转载)2009-03-01 15:41 (分类:默认分类) 先总结一下: J2SE   (Core/Desktop) ...

  9. 菜鸟版JAVA设计模式-从抽象与实现说桥接模式

    桥接模式,初学的时候事实上非常不理解为什么要把这个模式命名为桥接模式,脑海里突然联想到.事实上我学习是一件比較痛苦的事情,由于我必需要知道来龙去脉才干学的进去,所以,非常快我就对这个命名产生了兴趣,桥 ...

随机推荐

  1. Git 常用命令 思维导图(转)

    Git 是一个很强大的分布式版本控制系统.它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势. 本来想着只把最有用.最常用的 Git 命令记下来,但是总觉得这个也挺有用.那个也用 ...

  2. 具体解说Android的图片下载框架UniversialImageLoader之磁盘缓存(一)

    沉浸在Android的开发世界中有一些年头的猴子们,预计都可以深深的体会到Android中的图片下载.展示.缓存一直是心中抹不去的痛.鄙人亦是如此.Ok,闲话不说.为了督促自己的学习.以下就逐一的挖掘 ...

  3. Android 演示 DownloadManager——Android 下载 apk 包并安装

    本文内容 环境 项目结构 演示下载 参考资料 本文是 github 上 Trinea-Android-common 和 Trinea-Android-Demo 项目的一部分,将下载部分分离出来,看看如 ...

  4. jQuery.event详细解析

    介绍之前先介绍jQuery的一个方法 jQuery.event.fix(event || window.event); 此方法个浏览器的event对象转换为 jQuery.event; 如果您的事件是 ...

  5. python 不需要函数重载

    函数重载主要是为了解决两个问题. 可变参数类型. 可变参数个数. 另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其 ...

  6. MySQL 批量杀mysql线程

    mysql> SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='root'; +---- ...

  7. iOS中TableView小技巧

    摘要: TableView是ios开发中经经常使用到的控件,这里统一记录一下开发中遇到的经常使用小技巧,不断探索更新.也希望大家能够告诉我很多其它经常使用的小技巧啦~一起进步 1.去除多余的列表线条 ...

  8. 转 解决:error: Cannot find libmysqlclient_r under /usr/local/mysql.

    配置php的时候出现以下问题解决方案 checking for MySQL support... yeschecking for specified location of the MySQL UNI ...

  9. quartz持久化部署实现

    http://blog.csdn.net/wxniitxueyuan/article/details/50477712

  10. 浅谈ELK日志分析平台

    作者:珂珂链接:https://zhuanlan.zhihu.com/p/22104361来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 小编的话 “技术干货”系列文章 ...