灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3734回复:0

第二个Activity和Android ListView控件

楼主#
更多 发布于:2012-09-06 13:42


上一个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,是非常重要滴。另外,理解函数的依赖的基础,也是很重要滴,不是能简单的调用就可以滴,要深入理解隐藏在背后的东西。



喜欢0 评分0
游客

返回顶部