第二个Activity和Android ListView控件
上一篇:http://www.zzzyk.com/kf/201203/121466.html
上一个Activity中已经看到,start的是第二个Activity。写程序的都觉得程序理解起来比较容易,还是先奉上代码。
先看list_item.xml文件:
1 <?xml version="1.0" encoding="utf-8"?>
2
3 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent"
6 android:padding="10dp"
7 android:textSize="16sp" >
8 </TextView>
xml文件很简单,就一个TextView,用来显示List中的每一个item。这个是在eclipse中GraphLayout中拖进去,自动生成。其中需要注意的是textSize这个可以修改,它决定了字体的大小。这里字体的单位是sp。
下面来看Java代码:
1 package Workshop.english.englishwords;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.widget.*;
6 import android.view.*;
7 import android.app.ListActivity;
8 import android.content.Intent;
9 import android.widget.AdapterView;
10 import android.widget.AdapterView.OnItemClickListener;
11
12 /* This list activity list all unit1~12 */
13 public class UnitListAdapter extends ListActivity {
14
15
16 @Override
17 protected void onCreate(Bundle savedInstanceState)
18 {
19
20 super.onCreate(savedInstanceState);
21
22 setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, UNIT_NAME));
23 ListView lv = getListView();
24 lv.setTextFilterEnabled(true);
25
26 lv.setOnItemClickListener(new OnItemClickListener() {
27 public void onItemClick(AdapterView<?> parent, View view,
28 int position, long id) {
29
30 Intent intent = new Intent(UnitListAdapter.this, WordActivity.class);
31 startActivity(intent);
32 }
33 });
34 }
35
36 static final String[] UNIT_NAME = new String[] {
37 "unit1", "unit2", "unit3", "unit4", "unit5", "unit6"};
38 }
代码其实很简单。我一直崇尚简单。简单容易理解。特别对于初学者,简单的代码使人能抓住重点,不会迷失。
注意到这里用到的关键控件是ListView。ListView控件在我们看到的应用中使用十分广泛,我们最常见的app store中找需要的app时,看到的就是是ListView。
所以在这里继承的是ListActivity,而不是 直接继承于Activity。和ListView密切的一个东西就是listAdapter。
在这里,反映了MVC的模式。M是模式,其实是数据源,V是视图,是显示数据的,C是控制,是控制数据的,它是联系M和V的纽带。
在这里例子里,可以把我定义的静态的String数组看作是M,ListView看作是V,而listAdapter就是C。那么,可以这么说,adapter就是将String数组中的数据,也就是那些string显示到ListView中。line 22 的函数调用正反映了这个过程。
接下来的一个关键是定义每个item上的click,也就是,我希望和我们使用app store的经验一项,点一下一个item,便会在下一个屏幕中显示item的内容。
所以,这里给ListView给item设置了事件监听,line 26实现了这个设置。在listener中实现了onItemClick方法,目的是切换到另一个Activity----WordActivity。
这个程序,不得不说的是,它可能过于简单。一个方面,只有一个简单的ListView,第二个方面,ListView中的只有简单的几个数据,最后,在监听到事件之后,只是简单的切换到另一个Activity。
为什么这么简单,主要是因为我做的是原型,原型不需要那么复杂。简单的容易控制。在最后的程序中,这里的setListAdapter可以用其他更好的方法,另外还有两种Adapter。最重要的是,数据源肯定不会是这样的数组,关于数据存储,大量的数据可以存在数据库中,少量的数据可以以文件的形式存放。所以会有专门的类负责数据获取。
总的来说,原型是没有问题了,而且基本的元素也具备了,了解到了重要的控件ListView的各个方面。
最后,还是来分享下调试过程中积累的经验。
开始写程序的时候,基本上是找个例子模仿。
从官网上找了一个例子,模仿了一下。基本上,我是对的,但是,可惜的是,只对了一半。前面说到的,Activity和xml文件紧密的结合在一起。我的代码中用到了ListView,我从官网上找了一个ListView的例子模仿了一下,这是刚开始写代码的时候,不是么?可是很不幸,官网上没有xml的文件,我只能自己根据自己的理解去写xml。我的程序一运行就出问题。而且debug显示,就处在ListView的这个Activity里。但是到底在哪里,还是未知。能看到代码处在setViewAdapter调用的这一行,但是深入进去,却看不到。
久攻不下,我还是选择求助于网络。在网上搜了很多的用到ListView的例子,仔细分析,找出和我的程序的差异。皇天不负苦心人,终于找到一个基本接近的例子。再看看,Java程序应该没有什么问题,差异就在xml文件里。经验告诉我,我的xml文件有问题。
看看我的xml文件,加的是一个LinearLayout,但是例子里加的是TextView. Good,就按照例子中的加一个TextView, 结果,一下子就好了。
回头仔细想想也是。因为ListView中的String需要显示在TextView里,如果没有TextView,那么用Adapter的时候,String数据就没地方放。那么分析下来,肯定是在setViewAdapter的函数里找TextView没有找到,所以出现了对象为空,故出错。
这个经历使我进一步认识到:xml,是非常重要滴。另外,理解函数的依赖的基础,也是很重要滴,不是能简单的调用就可以滴,要深入理解隐藏在背后的东西。
摘自 爱心觉罗氏
补充:移动开发 , Android ,