免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2125 | 回复: 1
打印 上一主题 下一主题

第二个Activity和Android ListView控件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-02 16:09 |只看该作者 |倒序浏览
第二个Activity和Android ListView控件







上一个Activity中已经看到,start的是第二个Activity。写程序的都觉得程序理解起来比较容易,还是先奉上代码。

先看list_item.xml文件:
  1. 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. 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     @Override17     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
2 [报告]
发表于 2012-03-02 16:09 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP