在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