android ListView item有多重布局

android的listview的一个关键技术就是重绘利用。

public View getView(int position, View convertView, ViewGroup parent) {

return null;

}

从Adatper的getview函数我们可以知道,函数提供了一个convertView的对象,这个对象是我们可以在一个列表中重复利用避免每次getview都进行重绘的关键。我们平常使用的都是大多是单个布局的item,所以我们可以通过建立一个holder就可以重复利用同一个结构的item。但是如果我们的布局中需要在列表中出先一些个别的item,他的结构跟别的不一样。比如第一项,或者最后一项跟其他项不一样,这时候该怎么做。很多人说直接通过position来判断就好了,在不同position的时候使用不同的布局。但是想法是很好的一实践就发现许多问题。

google官方文档在关于getview函数的时候有明确的提示,当遇到不同item结构的时候应该怎么处理只不过没有详细的实例。下面就根据自己遇到的问题举个实例。

google文档中:

convertView : The old view to reuse, if possible. Note: You should check that this view is non-null and of
an appropriate type before using. If it is not possible to convert this view to display the correct data, this method can create a new view. Heterogeneous lists can specify their number of view types, so that this View is always of the right type (see getViewTypeCount() and getItemViewType(int)).
  也就是说如果你在对convertView操作的时候除了要判断他是不是为空,在多种布局的时候你还得通过getViewTypeCount()来指定你有几种布局,和通过getItemViewType()来获得你当前获得的是哪种结构的view。为什么要这么做,不能用position直接来判断呢,主要原因是你每次在通过getview获取到的convertView的时候你无法知道这个时候系统复用了哪个布局的view,这样你在使用converView的holder 的时候就有可能获取的不是你想要的holder这个时候,你就有可能报空指针异常之类的错误。好了既然知道了原理我们来看下具体的例子。

例子,原型是,第一个item使用了一个布局layout_one,其他所有的item使用的是布局layout_two。

代码:

在adapter里面定义几个常量

private static final int ITEM_LAYOUT_TYPE_COUNT = 2;

private static final int TYPE_ONE= 0;

private static final int TYPE_TWO = 1;

//重写 getViewTypeCount(), getItemViewType();

@Override

public int getViewTypeCount() {

return ITEM_LAYOUT_TYPE_COUNT;

}

// 当系统通过getview获取convertView的时候通过getItemViewType()可以获取到相应position的类型。

@Override

public int getItemViewType(int position) {

if(position == 0) {

return TYPE_ONE;

} else {

return TYPE_TWO
;

}

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

OneHolder oneHolder = new OneHolder();

TwoHolder twoHolder = new TwoHolder();

int layoutType = getItemViewType(position);

if(TYPE_ONE == layoutType) {

if(null == convertView) {

convertView = (LinearLayout) mLayoutInflater.inflate(R.layout.one_layout, null);

oneHolder.oneButton = (Button)convertView.findViewById(R.id.one_button);

convertView.setTag(oneHolder);

} else {

oneHolder = (OneHolder) convertView.getTag();

}

} else if(TYPE_TWO == layoutType) {

if(null == convertView) {

convertView = (LinearLayout) mLayoutInflater.inflate(R.layout.two_layout, null);

twoHolder.twoText = (TextView)convertView.findViewById(R.id.two_text);

convertView.setTag(twoHolder);

} else {

twoHolder = (TwoHolder) convertView.getTag();

}

}

return convertView;

}

当然你如果只是单纯不利用复用布局,使用position来做判断选择不同的布局也是可以的,但是如果你的这个布局不算太大的话是没太大问题的,但是如果你的布局稍微复杂点,也就是你每次进行滑动的时候系统会进行重绘,这个时候你就会发现界面一卡一卡的。

android ListView item有多重布局

时间: 08-13

android ListView item有多重布局的相关文章

android listview item点击展开

最近做项目真是头疼呢?之前想用ListViewAnnotation来着,就是可以实现类似于android 通知栏滑动删除的效果.好像是一位大牛自己一个人写的吧.我在这里首先向他致敬.不过,话说回来,实现原理也是比较易于理解的,就是检测你的滑动距离以及速度,再作出判断,进行操作.具体大家参考下Google keep的两种列表模式下滑动删除的操作就理解类. 非常不幸的事,我再布局中用了fragment和biewpager,所以产生了手势冲突,我为此改写了library里的手势操作检测方法,最后勉强改

android listview item点击后,显示点击效果

最近遇到了一个问题,在用到listview时,想在listview的item点击后显示高亮的效果,但是在activity中写listview的onitemclick事件中写变色效果后,点击可以变色,但是在listview滑动后,这个效果竟然消失了?很是纠结,为什么呢?原因没有搞太懂,好像是在滑动的时候又触发了adapter,所以导致效果消失.后来找到一种解决办法,分享下: 在listview的adapter中添加如下方法: /**  * 增加用户点击时,获得位置,并改变颜色  * @param

Android listview item中使用TextWatcher

链接占位.回头补充:http://stackoverflow.com/questions/20958223/edittext-in-listview-is-updated-by-ontextchanged-when-scrolling 下solmaks的回答.

Android ListView多布局讲解

Listview优化是一个老生常谈的事情了,其优化的方面也有很多种,例如,布局重用.在getView()中减少逻辑计算.减少在页面滑动的时候加在图片,而是在页面停止滚动的时候再加在图片.而今天要介绍的是另一种方式,那就是多布局. 一般使用的场景有一下两种情况: ① 当一个item有多重布局的情况下,使用部分隐藏来实现既笨拙又效率低下,这时多布局会是个不错的选择: ② 当一个item很复杂,页面内容多,item高度很高,甚至超过手机屏幕,这个时候就需要使用多布局将页面拆分成多个小item来提高执行

【转】Android ListView加载不同的item布局

原创教程,转载请保留出处:http://www.eoeandroid.com/thread-72369-1-1.html 最近有需求需要在listView中载入不同的listItem布局,开始没有使用convertView,加载了多个item后导致了内存泄露,所以回来研究convertView在多个listItem布局时的缓存及应用,并且和大家分享 构造Adapter时,没有使用缓存的 convertView,导致内存泄露 示例代码:public View getView(int positio

Android基础入门教程——2.4.8 ListView Item多布局的实现

Android基础入门教程--2.4.8 ListView Item多布局的实现 标签(空格分隔): Android基础入门教程 本节引言: 本节是ListView这个小节的最后一节,给大家带来的是ListView多布局Item的实现, 何为ListView Item多布局,打个比方,QQ这种聊天列表: 假如他是用一个ListView做的,那么一个ListView上不就有两种不同的Item咯! 一左一右,嘿嘿,本节就来教大家如何实现ListView的多布局! 1.要点讲解: 重写getItemV

android listview的item布局中含有button,不会响应listview的onitemclick监听 以及 onitemlongclick监听问题解决

效果图: activity的布局xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent&qu

Android ListView 多种布局--进阶二

Android ListView 多种布局–进阶一 中提及了这么一个需求,本博文就这个需求的实现做进一步探讨. 前面是单列,后面是双列的情况,使用ListView实现,一般的解决思路是处理getView和getCount方法,如下实现: 首先实现Adapter,处理getView和getCount方法 public class DoubleAdapter extends BaseAdapter implements OnClickListener{ private List<String> m

android 设置listview item选中背景色

listview是android常用的控件,点击listview item时,默认显示橘黄色的背景色,而且翻滚时也显示相应的颜色.这样往往会跟实际的软件UI设计风格很不协调.通过对listview背景颜色的设置,从而实现与软件UI风格相协调. 改变listview背景选项往往采用建立一个xml文件,如listview_bg.xml,里面定义selector的相关属性,将文件放着drawable的资源文件当资源文件使用,在listview item配置背景属性android:background=