ListView初步解析

本文详细阐述了Android程序中ListView组件的使用方法,包括如何在XML文件中定义ListView,如何重写ListView的方法以适配ScrollView,以及如何创建自定义的Adapter来展示数据。同时介绍了如何在Adapter中实现复杂视图的加载与类型识别,以及如何使用ListView的特殊方法如`setSelection`和`addHeaderView`来增强列表功能。

在android程序开始中,经常需要用到 ListView组件,所以在此写下此一个人经验,方便大家同时也方便自己。

ListView 一般写在 XML里面,当然也可以用代码动自动创建,默认情况下,ListView 不能放到 ScrollView中使用,如果要一起使用,则重写ListView中的 OnCrollXXX方法。

在开发过程中, ListView 中的 Adapter 一般情况都继承自 BaseAdapter,因为 BaseAdapter 是最灵活的也是最好使的。

在写 Adpter 的过程中,最少需要重写里面的 

getItem();
getCount();
getView(int position, View convertView, ViewGroup parent);
为了节约内存 一般会在 getView(int position, View convertView, ViewGroup parent)方法中判断 当前的 
convertView 是否已经加载 例如这样的代码 
int type = getItemViewType(position);
   if(null == convertView){
     Log.i("view_type","进入 if");
     switch (type){
       case monthNoticeView :
         convertView = LayoutInflater.from(context).inflate(R.layout.love_listen_notice_iterm,parent,false);
         noticeItermViewHolder = new LovelistenNoticeItermViewHolder(convertView);
         convertView.setTag(noticeItermViewHolder);
         break;
       case easyAmomentView :
         convertView = LayoutInflater.from(context).inflate(R.layout.easy_a_moment, parent, false);
         easyAmomentViewHolder = new EasyAmomentViewHolder(convertView);
         convertView.setTag(easyAmomentViewHolder);
         break;
       default:
         break;
     }
   }
else{  // 当有 convertView 的时候,按样式,取得不用的布局
     Log.i("view_type","进入 else");
     switch (type){
       case monthNoticeView :
         if(convertView.getTag() instanceof LovelistenNoticeItermViewHolder){
           noticeItermViewHolder = (LovelistenNoticeItermViewHolder)convertView.getTag();
         }else{
           Log.i("view_type","进入 else 创建 love_listen_notice_iterm");
           convertView = LayoutInflater.from(context).inflate(R.layout.love_listen_notice_iterm,parent,false);
           noticeItermViewHolder = new LovelistenNoticeItermViewHolder(convertView);
           convertView.setTag(noticeItermViewHolder);
         }
         break;
       case easyAmomentView :
         if(convertView.getTag() instanceof EasyAmomentViewHolder){
           easyAmomentViewHolder = (EasyAmomentViewHolder)convertView.getTag();
         }else{
           Log.i("view_type","进入 else 创建 easy_a_moment");
           convertView = LayoutInflater.from(context).inflate(R.layout.easy_a_moment, parent, false);
           easyAmomentViewHolder = new EasyAmomentViewHolder(convertView);
           convertView.setTag(easyAmomentViewHolder);
         }

         break;
       default:
         break;
     }
 当需要加载多种类型的 View 时,则重写 
     public int getItemViewType(int position)  根据当前的 position 类型去加载所需要的view类型。
 假如我们的ListView 中有很多的 Iterm时,我想指定到某一个位置,ListView 为我们提供了 
     public void setSelection(int position) 方法,当指定 position为 0时,则回到 ListView的顶部。
当我们需要加载的 View 过于复杂时,ListView 为我们提供了一个 ListView.addHeaderView(View view);方法,
 我们只需要通过 LayoutInflate的inflate(View view, ViewGroup convertView, boolean flag)方法将需要的View加载上来,
 然后再加载到 ListView 中的 header or footer部份则可。
 当然 ListView 的特性还有很多,比如 ImageView 中的图片异步加载....
我暂时只知道这么多,必要的时候请看 google 老师的:http://developer.android.com/guide/topics/ui/layout/listview.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值