哪里有卖写好外卖 帮程序员写代码的badUSB

查看: 126|回复: 21
【ListView笔记】ListView的item多布局的复用
牛人, 积分 368, 距离下一级还需 132 积分
牛人, 积分 368, 距离下一级还需 132 积分
注册时间13-8-8
在线时间29 小时
主题帖子积分
牛人, 积分 368, 距离下一级还需 132 积分
牛人, 积分 368, 距离下一级还需 132 积分
发表于 17-3-31 11:01:26
ListView的item多布局的复用&&多布局重用的场景用的还是挺多的,例如:微信好友列表 有字母的布局 和 联系人的布局;今日头条 在新闻列表中,有专题布局(大图) 等。多种布局同时存在一个 列表视图中的时候。
使用一个 ConvertView 重用肯定是不行的。
Adapter 提供两个方法:
@Override
& &public int getViewTypeCount() {
& &//返回视图类型个数(可以理解成告诉 Adapter 需要几个缓存几个 ConvertView )
& &&&return 2;
& &}&&
& && && && && &
& &&&@Override
& &&&public int getItemViewType(int position) {
& && &//根据视图的位置返回 相应的 int 值 (例如:10的整数倍 返回1 否则返回0)
& && & return&&position % 10 == 0 ? 1 : 0;
& &&&}复制代码
那么,在 Adapter 的 getView 中需要这么处理:
& &@Override
& & public View getView(int position, View convertView, ViewGroup parent) {
& && & NewsViewHolder mNewsViewH//第二布局的 ViewHolder
& && & ItemViewHolder mItemViewH//默认 Item 布局的 ViewHolder
& && & switch (getItemViewType(position)) {//根据 当前位置的视图类型做相应的处理
& && && & case 1:
& && && && &if (convertView == null) {
& && && && && &Log.d(&TAG&, &news 布局 is null...&);
& && && && && &mNewsViewHolder = new NewsViewHolder();
& && && && && & convertView = getLayoutInflater().inflate(R.layout.view_list_item_news, parent, false);
& && && && && & mNewsViewHolder.btn_show = (Button) convertView.findViewById(R.id.btn_show);
& && && && && & convertView.setTag(mNewsViewHolder);
& && && && &} else {
& && && && &&&mNewsViewHolder = (NewsViewHolder) convertView.getTag();
& && && && &&&Log.d(&TAG&, &news 布局重用啦...&);
& && && && &}
& && && && &&&mNewsViewHolder.btn_show.setText(&你好世界!& + position);
& && && && &&&return convertV
& && && && &&&default:
& && && && &if (convertView == null) {
& && && && &&&mItemViewHolder = new ItemViewHolder();
& && && && &&&convertView = getLayoutInflater().inflate(R.layout.view_list_item_1, parent, false);
& && && && &&&.tv_show = (TextView) convertView.findViewById(R.id.tv_show);
& && && && &&&convertView.setTag(mItemViewHolder);
& && && && &} else {
& && && && &&&mItemViewHolder = (ItemViewHolder) convertView.getTag();
& && && && &}
& && && && && & // 在这里去更新UI
& && && && &mItemViewHolder.tv_show.setText(&Hello World!& + position);
& && && && &return convertV
& && && & }
& && & }
& && & class NewsViewHolder {
& && && & Button btn_
& && & }
& && & class ItemViewHolder {
& && && & TextView tv_
& && & }复制代码
注册时间14-1-7
在线时间0 小时
主题帖子积分
发表于 17-3-31 11:31:44
高大上,玩不起
牛人, 积分 227, 距离下一级还需 273 积分
牛人, 积分 227, 距离下一级还需 273 积分
注册时间13-8-27
在线时间6 小时
主题帖子积分
牛人, 积分 227, 距离下一级还需 273 积分
牛人, 积分 227, 距离下一级还需 273 积分
发表于 17-3-31 13:19:28
看来玩的不错
牛人, 积分 294, 距离下一级还需 206 积分
牛人, 积分 294, 距离下一级还需 206 积分
注册时间13-8-27
在线时间10 小时
主题帖子积分
牛人, 积分 294, 距离下一级还需 206 积分
牛人, 积分 294, 距离下一级还需 206 积分
发表于 17-3-31 15:10:52
不能不赞!!!!!!!!!
注册时间14-2-23
在线时间0 小时
主题帖子积分
发表于 17-3-31 15:15:53
团队让人温暖
牛人, 积分 259, 距离下一级还需 241 积分
牛人, 积分 259, 距离下一级还需 241 积分
注册时间13-8-27
在线时间14 小时
主题帖子积分
牛人, 积分 259, 距离下一级还需 241 积分
牛人, 积分 259, 距离下一级还需 241 积分
发表于 17-3-31 19:31:05
秋天虽然到了。但是。。依旧热
大虾, 积分 75, 距离下一级还需 125 积分
大虾, 积分 75, 距离下一级还需 125 积分
注册时间13-11-18
在线时间2 小时
用户组lmnop56245
用户组lmnop56245
主题帖子积分
大虾, 积分 75, 距离下一级还需 125 积分
大虾, 积分 75, 距离下一级还需 125 积分
发表于 17-3-31 21:19:05
2048个赞,确实很有实力呀!
牛人, 积分 294, 距离下一级还需 206 积分
牛人, 积分 294, 距离下一级还需 206 积分
注册时间13-8-27
在线时间10 小时
主题帖子积分
牛人, 积分 294, 距离下一级还需 206 积分
牛人, 积分 294, 距离下一级还需 206 积分
发表于 17-3-31 21:19:07
其实看了更多觉得进入千锋都是努力的人,付出多少就能收获多少,加油。
大虾, 积分 164, 距离下一级还需 36 积分
大虾, 积分 164, 距离下一级还需 36 积分
注册时间13-8-27
在线时间7 小时
主题帖子积分
大虾, 积分 164, 距离下一级还需 36 积分
大虾, 积分 164, 距离下一级还需 36 积分
发表于 17-3-31 21:24:13
一个个看过去,很给力
牛人, 积分 328, 距离下一级还需 172 积分
牛人, 积分 328, 距离下一级还需 172 积分
注册时间13-8-27
在线时间12 小时
主题帖子积分
牛人, 积分 328, 距离下一级还需 172 积分
牛人, 积分 328, 距离下一级还需 172 积分
发表于 17-3-31 21:44:32
好顶赞!支持我大千锋
GMT+8, 17-4-28 20:43
Powered byyangxiaoming123 的BLOG
用户名:yangxiaoming123
文章数:54
访问量:3634
注册日期:
阅读量:5863
阅读量:12276
阅读量:411956
阅读量:1100054
51CTO推荐博文
一般是针对包含多个元素的View,如ListView,GridView,ExpandableListview,的时候我们是给其设置一个Adapter。Adapter是与View之间提供数据的桥梁,也是提供每个Item的视图桥梁。650) this.width=650;" class="fit-image" id="aimg_O99uX" border="0" alt="" width="498" height="322" src="http://img.blog.csdn.net/37437?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXp6c3Q=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" style="border:0" />以ListView为例,其工作原理为:● ListView针对List中每个item, adapter都会调用一个getView的方法获得布局视图●我们一般会Inflate一个新的View,填充数据并返回显示当然如果我们的Item很多话(比如上万个),都会新建一个View吗?很明显这样内存是接受不了的,Google也不会这么做,Android中有个叫做Recycler的构件,下图是他的工作原理:650) this.width=650;" class="fit-image" id="aimg_W222d" border="0" alt="" width="498" height="410" src="http://img.blog.csdn.net/36562?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXp6c3Q=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" style="border:0" />很明显,无论数据中是多少个item,在显示上Recycler只存储其中可见的View在内存中。当向下滑动时,顶部不可见Item直接回移动到下方再次填充数据变为新增项。这样就不用每次都新建一个View了。这个也就是我们在Adapter中常见的getView方法的调用,对应此方法我们就能看出,convertView就是每一Item在Recyler之前的布局视图。public View getView(int position, View convertView, ViewGrouppare所以,Android已经给我们提供了Recycler机制了,我们就应该利用此机制,而不是每次都去inflate一个View。ExampleDon’tpublic&View&getView(int&position,&View&convertView,&ViewGroupparent){&&&&&&&convertView&=&LayoutInflater.from(mContext).inflate(R.layout.item_view,null);&&&&&&&//dosomething…&&&&&&&return&converV&&&}Dopublic&View&getView(int&position,&View&convertView,&ViewGroupparent){&&&&&&&&if&(convertView&==null)&{&&&&&&&&&&&&&&convertView&=LayoutInflater.from(mContext).inflate(R.layout.item_view,&null);&&&&&&&&}&&&&&&&//dosomething…&&&&&&&return&converV&&&}ViewHolder的作用之前所说的Recycler模式是为了解决重复inflate时候造成的View资源浪费,还哪有什么方法何可再次优化我们的性能吗?答案是Yes。我们还是从getView中的每一个方法调用去查看,发现其实我们拿到convertView的时候,每次都会根据这个布局去findViewById。如下,使我们通常的写法:findViewById是在解析layout.xml布局那种其中的子View,解析xml是一个力气活,所以Google也建议我们将这个费力不讨好的活优化起来,所以提出了ViewHolder的概念。即,使用一个静态类,保存xml中的各个子View的引用关系,这样就不必要每次都去解析xml了。如下:就是针对上面代码写的一个ViewHolderif&(convertView&==&null)&{&&&&&&&&&&&&&&&&&&&convertView&=&mInflater.inflate(R.layout.item_view,&null);&&&&&&&&&&&&&}&&&&TextView&titleTextView&=&(TextView)&convertView.findViewById(R.id.text));&&&&&&&&&&&&ImageView&iconImageView&=&(ImageView)convertView.findViewButId(&R.id.icon));&&&&//DoSomething…findViewById是在解析layout.xml布局那种其中的子View,解析xml是一个力气活,所以Google也建议我们将这个费力不讨好的活优化起来,所以提出了ViewHolder的概念。即,使用一个静态类,保存xml中的各个子View的引用关系,这样就不必要每次都去解析xml了。如下:就是针对上面代码写的一个ViewHolderstatic&class&ViewHolder&{&&&&&&&&TextView&titleTextV&&&&&&&&ImageView&iconImageV&&&&}但是,在getView方法中我们只能拿到三个参数,position、convertView、viewGroup是拿不到我们自定义的ViewHolder的。所以,我们希望通过convertView拿到ViewHolder只能将其放在tag里。下面是一个完整的ViewHolder使用exmaple:public&View&getView(int&position,&View&convertView,&ViewGroup&parent)&{&&&&&&&ViewHolder&&&&&&&&if&(convertView&==&null)&{&&&&&&&&&&&convertView&=&mInflater.inflate(R.layout.item_view,&null);&&&&&&&&&&&holder&=&new&ViewHolder();&&&&&&&&&&&holder.titleTextView&=&(TextView)&convertView.findViewById(R.id.text);&&&&&&&&&&&holder.iconImageView&=&(ImageView)&convertView.findViewById(R.id.icon);&&&&&&&&&&&convertView.setTag(holder);&&&&&&&}&else&{&&&&&&&&&&&holder&=&(ViewHolder)&convertView.getTag();&&&&&&&}&&&&&&&holder.titleTextView.setText(DATA[pos].title);&&&&&&&holder.iconImageView.setImageBitmap(DATA[pos].bitmap);&&&&&&&return&convertV&&&}&&&&&&static&class&ViewHolder&{&&&&&&&TextView&titleTextV&&&&&&&ImageView&iconImageV&&&}Tips. Support.v7中的RecyclerView 就是采用了此思想来制作的。多个类型的ViewType当我们在Adapter中调用方法getView的时候,如果整个列表中的Item View如果有多种类型布局,如:650) this.width=650;" class="fit-image" id="aimg_Gj3GR" border="0" alt="" width="480" height="598" src="http://img.blog.csdn.net/45234?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXp6c3Q=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" style="border:0" />我们继续使用convertView来将数据从新填充貌似不可行了,因为每次返回的convertView类型都不一样,无法重用。Android在设计上的时候,也想到了这点。所以,在adapter中预留的两个方法。public int getItemViewType(int position) ;&public int getViewTypeCount();只需要重新这两个方法,设置一下ItemViewType的个数和判断方法,Recycler就能有选择性的给出不同的convertView了。&&& && &Example:@Override&&&public&intgetItemViewType(int&position)&{&&&&&&&if&(DATA[pos].type&==&0)&{&&&&&&&&&&&return&0;&&&&&&&}&else&{&&&&&&&&&&&return&1;&&&&&&&}&&&}&&&&&&@Override&&&public&int&getViewTypeCount()&{&&&&&&&return&2;&&&}&&&&&&@Override&&&public&View&getView(int&position,&View&convertView,&ViewGroup&arg2)&{&&&&&&&TitleViewHolder&titleH&&&&&&&InfoViewHolder&infoH&&&&&&&int&type&=&getItemViewType(position);&&&&&&&&&&if&(convertView&==&null)&{&&&&&&&&&&&switch&(type)&{&&&&&&&&&&&case&0:&&&&&&&&&&&&&&&convertView&=&mInflater.inflate(R.layout.item_view,&null);&&&&&&&&&&&&&&&titleHolder&=&new&TitleViewHolder();&&&&&&&&&&&&&&&titleHolder.titleTextView&=&(TextView)&convertView.findViewById(R.id.text);&&&&&&&&&&&&&&&titleHolder.iconImageView&=&(ImageView)&convertView.findViewById(R.id.icon);&&&&&&&&&&&&&&&convertView.setTag(titleHolder);&&&&&&&&&&&&&&&&&&&&&&&&&&case&1:&&&&&&&&&&&&&&&convertView&=&mInflater.inflate(R.layout.item_view2,&null);&&&&&&&&&&&&&&&infoHolder&=&new&InfoViewHolder();&&&&&&&&&&&&&&&infoHolder.titleTextView&=&(TextView)&convertView.findViewById(R.id.text);&&&&&&&&&&&&&&&convertView.setTag(infoHolder);&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&}&else&{&&&&&&&&&&&switch&(type)&{&&&&&&&&&&&case&0:&&&&&&&&&&&&&&&titleHolder&=&(TitleViewHolder)&convertView.getTag();&&&&&&&&&&&&&&&&&&&&&&&&&&case&1:&&&&&&&&&&&&&&&infoHolder&=&(InfoViewHolder)&convertView.getTag();&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&}&&&&&&&switch&(type)&{&&&&&&&case&0:&&&&&&&&&&&titleHolder.titleTextView.setText(DATA[pos].title);&&&&&&&&&&&&&&&&&&case&1:&&&&&&&&&&&infoHolder.titleTextView.setText(DATA[pos].title);&&&&&&&&&&&infoHolder.iconImageView.setImageBitmap(DATA[pos].bitmap);&&&&&&&&&&&&&&&&&&}&&&&&&&&&&return&convertV&&&}&&&&&&static&class&TitleViewHolder&{&&&&&&&public&ImageView&iconImageV&&&&&&&public&TextView&titleTextV&&&}&&&&&&static&class&InfoViewHolder&{&&&&&&&TextView&titleTextV&&&&&&&ImageView&iconImageV&&&}NotifyDataSetChanged刷新机制当ListView中的数据发生了改变,我们希望刷新ListView中的View时,我们一般会调用NotifyDataSetChanged来刷新ListView。看一下它的源码:public&void&notifyChanged()&{&&&&&&&synchronized&(mObservers)&{&&&&&&&&&&&//&向每一个子View发送onChanged&&&&&&&&&&&for&(int&i&=&mObservers.size()&-&1;&i&&=&0;&i--)&{&&&&&&&&&&&&&&&mObservers.get(i).onChanged();&&&&&&&&&&&}&&&&&&&}&&&}发 现它针对每一个子View都做了刷新,当然,如果我们的数据都变量还可以理解。但是,一般条件下,我们需要更新的View不多。频繁的调用 NotifyDataSetChanged方法,刷新整个界面不合适。这样会把界面上显示的所有item都全部重绘一次,即使只有一个view的内容发生 了变化。所以,我们可以写一个update的方法,来单独刷新一个Viewprivate&void&updateView(int&itemIndex){&&&&&&&intvisiblePosition&=&yourListView.getFirstVisiblePosition();&&&&&&&Viewv&=&yourListView.getChildAt(itemIndex&-&visiblePosition);&&&&&&&&&&&&ViewHolder&viewHolder&=(ViewHolder)v.getTag();&&&&&&&&&&&&if(viewHolder!=&null){&&&&&&&&&&&&&&&&&&viewHolder.titleTextView.setText("我更新了");&&&&&&&&&&&&}&&&&&&}Adapter中的网络图片优化ListView中的每一项Item基本都会带着网络图片,当item比较多的时候,过多的网络请求和过多的图片存储都会是ListView变慢变卡。所以针对其做一下优化:& ●&&采用线程池进行网络图片请求,网络图片请求获取后使用本地缓存处理(LRUCache),内存+本地文件缓存。当然,为了防止内存溢出与回收不及时,需要使用弱引用(WeakReference)来存储内存中的图片。& ●&&对网络中取到的图片进行按比例缩放,以减少内存消耗。& ●&&滑动的时候不需要对网络图片进行请求。因为,网络请求一般比较耗时,某Item的图片,在请求来的时候如果被Recycler换掉,图片就会对应不上该Item。&Tips.网络请求的工具类比较多不方便举例子,但是使用比较频繁的网络图片请求工具类就是Volley了,Volley提供了一个ImageLoader的工具类和NetworkImageView的网络图片请求View本文链接:/thread--1.html
了这篇文章
类别:未分类┆阅读(0)┆评论(0)【Android笔记】listview加载性能优化及有多种listitem布局处理方式-爱编程
【Android笔记】listview加载性能优化及有多种listitem布局处理方式
在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容。
用户可以自由的定义listview每一列的布局,但当listview有大量的数据需要加载的时候,会占据大量内存,影响性能,这时候就需要按需填充并重新使用view来减少对象的创建。
ListView加载数据都是在
1 public View getView(int position, View convertView, ViewGroup parent) {
3   。。。。。。
方法中进行的(要自定义listview都需要重写listadapter:如 BaseAdapter,SimpleAdapter,CursorAdapter的等的getvView方法),
优化listview的加载速度就要让 convertView匹配列表类型,并最大程度上的重新使用convertView。
其中,getview的加载方法一般有以下三种加载方式:
1、最慢的加载方式是每一次都重新定义一个View载入布局,再加载数据
public View getView(int position, View convertView, ViewGroup parent) {
View item = mInflater.inflate(R.layout.list_item_icon_text, null);
((TextView) item.findViewById(R.id.text)).setText(DATA[position]);
((ImageView) item.findViewById(R.id.icon)).setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
2、正确的加载方式是当convertView不为空的时候直接重新使用convertView从而减少了很多不必要的View的创建,然后加载数据
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item, parent, false);
((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);
((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
return convertV
3、最快的方式是定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可
1 static class ViewHolder {
11 public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_icon_text,parent, false);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
27 } else {
holder = (ViewHolder) convertView.getTag();
holder.text.setText(DATA[position]);
holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 :mIcon2);
return convertV
三种方式加载效率对比如下图所示:
说明:上述三个例子代码摘自google 2010 I/O大会
当处理一些耗时的资源加载的时候需要做到以下几点,以使你的加载更快更平滑:
1.&&&适配器在界面主线程中进行修改
2.&&&可以在任何地方获取数据但应该在另外一个地方请求数据
3.&&&在主界面的线程中提交适配器的变化并调用notifyDataSetChanged()方法
===============================分割线=========================================
那么如果存在多个item样式如何处理呢??
大致思路就是创建多个viewholder,在getViewType的时候设置不同位置的item用不同的viewholder,
以下直接上代码:
1 class MyAdapter extends BaseAdapter{
Context mC
LinearLayout linearLayout = null;
final int VIEW_TYPE = 3;
final int TYPE_1 = 0;
final int TYPE_2 = 1;
final int TYPE_3 = 2;
//各个布局的控件资源
class viewHolder1{
CheckBox checkB
TextView textV
class viewHolder2{
TextView textV
class viewHolder3{
ImageView imageV
TextView textV
public MyAdapter(Context context) {
// TODO Auto-generated constructor stub
mContext =
inflater = LayoutInflater.from(mContext);
public int getCount() {
// TODO Auto-generated method stub
return listString.size();
//每个convert view都会调用此方法,获得当前所需要的view样式
public int getItemViewType(int position) {
// TODO Auto-generated method stub
int p = position%6;
if(p == 0)
return TYPE_1;
else if(p & 3)
return TYPE_2;
else if(p & 6)
return TYPE_3;
return TYPE_1;
//返回样式的数量
public int getViewTypeCount() {
// TODO Auto-generated method stub
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return listString.get(arg0);
public long getItemId(int position) {
// TODO Auto-generated method stub
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
viewHolder1 holder1 = null;
viewHolder2 holder2 = null;
viewHolder3 holder3 = null;
int type = getItemViewType(position);
//无convertView,需要new出各个控件
if(convertView == null)
Log.e("convertView = ", " NULL");
//按当前所需的样式,确定new的布局
switch(type)
case TYPE_1:
convertView = inflater.inflate(R.layout.listitem1, parent, false);
holder1 = new viewHolder1();
holder1.textView = (TextView)convertView.findViewById(R.id.textview1);
holder1.checkBox = (CheckBox)convertView.findViewById(R.id.checkbox);
Log.e("convertView = ", "NULL TYPE_1");
convertView.setTag(holder1);
case TYPE_2:
convertView = inflater.inflate(R.layout.listitem2, parent, false);
holder2 = new viewHolder2();
holder2.textView = (TextView)convertView.findViewById(R.id.textview2);
Log.e("convertView = ", "NULL TYPE_2");
convertView.setTag(holder2);
case TYPE_3:
convertView = inflater.inflate(R.layout.listitem3, parent, false);
holder3 = new viewHolder3();
holder3.textView = (TextView)convertView.findViewById(R.id.textview3);
holder3.imageView =
(ImageView)convertView.findViewById(R.id.imageview);
Log.e("convertView = ", "NULL TYPE_3");
convertView.setTag(holder3);
//有convertView,按样式,取得不用的布局
switch(type)
case TYPE_1:
holder1 = (viewHolder1) convertView.getTag();
Log.e("convertView !!!!!!= ", "NULL TYPE_1");
case TYPE_2:
holder2 = (viewHolder2) convertView.getTag();
Log.e("convertView !!!!!!= ", "NULL TYPE_2");
case TYPE_3:
holder3 = (viewHolder3) convertView.getTag();
Log.e("convertView !!!!!!= ", "NULL TYPE_3");
//设置资源
switch(type)
case TYPE_1:
holder1.textView.setText(Integer.toString(position));
holder1.checkBox.setChecked(true);
case TYPE_2:
holder2.textView.setText(Integer.toString(position));
case TYPE_3:
holder3.textView.setText(Integer.toString(position));
holder3.imageView.setBackgroundResource(R.drawable.icon);
return convertV
参考原文:
参考原文:
版权所有 爱编程 (C) Copyright 2012. . All Rights Reserved.
闽ICP备号-3
微信扫一扫关注爱编程,每天为您推送一篇经典技术文章。多种Item布局的ListView的实现方法-android100学习网
多种Item布局的ListView的实现方法
[Quik Start]继承BaseAdapter, 具体实现请参考\android\widget\SimpleAdapter.java重载public View getView(int position, View convertView, ViewGroup parent), 并在该函数里通过接口来加载不同Item......
&[Quik Start]
继承BaseAdapter, 具体实现请参考\android\widget\SimpleAdapter.java
重载&public View getView(int position, View convertView, ViewGroup parent)&, 并在该函数里通过接口来加载不同Item的布局(单一布局的情况下, 到这里就已经可以完成功能了...)
重载BaseAdapter中的&public int getViewTypeCount() &&public int getItemViewType(int position) 两个函数. 其中, 前者是用来告诉ListView有多少种Item布局, 而后者是用来告诉ListView应该根据位于position的元素返回第n(0,1,...N-1)种布局, 而ListView则根据该值来判断在调用getView时应该传入已缓存的convertView.
* 现以2种布局为例, 另外,代码要根据自身需求做响应修改
public class ExampleAdapter extends BaseAdapter {
private LayoutInflater mI
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
// 根据position元素生成item布局
int resource = ? [R.layout.item1 | R.layout.item2];
v = mInflater.inflate(resource, parent, false);
v = convertV
public int getItemViewType(int position) {
// 根据position元素返回View的类型, type值是从0开始排序的
int type = ? [0 | 1];
public int getViewTypeCount() {

我要回帖

更多关于 武汉二手房买卖程序 的文章

 

随机推荐