android中listView如何复用多种布局
我们都知道,当listView的item比较多的时候,会利用convertView对每个item进行缓存
但是这还不够,当我们的每个item布局中的控件比较多的时候,我们还会用ViewHolder对每个item布局中的view进行缓存,达到减少调用findViewById的次数目的,这样会让你的listView的滑动的时候会比较顺畅。
viewHolder复用一个布局的话,我相信谁都会,但是现实开发中往往我们会复用多个布局,这个时候我们该如何实现呢?
adapter填充数据的时候,我们一般要实现以下方法:
1 public int getCount(){ }
2 public Object getItem(int position) {}
3 public long getItemId(int position) {}
4 public View getView(int position, View view, ViewGroup viewGroup){}
但是要实现复用多种布局的话我们还要实现下面2个方法
1 public int getItemViewType(int position) {}
返回我们要复用的布局类型,假如我们要复用一个tab结构和item结构,我们可以这么来写
类别的数值在(0,类别总数-1)之间
public static final int TYPE_UNKNOW = 0; public static final int TYPE_TAB = 1; public static final int TYPE_LIST_ITEM = 2; public static final int TYPE_MAX_COUNT = 3; @Override public int getItemViewType(int position) { //复用tab结构 if (position == 1) { return TYPE_TAB; } //复用一般的item结构 int size = CollectionUtils.size(feedDataList); if (position >= 1 && size > 0 && position < (size + 2)) { return TYPE_LIST_ITEM; } return TYPE_UNKNOW; }
类别总数是3,类别对应的int值应该在0 - 2 之间,它们分别是
public static final int TYPE_UNKNOW = 0; public static final int TYPE_TAB = 1; public static final int TYPE_LIST_ITEM = 2;
2 public int getViewTypeCount() { } 返回复用布局的总数,这里是3
@Override public int getViewTypeCount() { return TYPE_MAX_COUNT; }
在adapter中的getView方法中,我们就可以这样来写:
@Override public View getView(int position, View convertView, ViewGroup viewGroup) { ItemViewHolder itemViewHolder; TabViewHolder tabViewHolder; int viewType= getItemViewType(position); switch (viewType) { case TYPE_TAB: if(convertView == null ) { tabViewHolder = new TabViewHolder(mContext); //给contenView赋值,并给viewHolder设置tag tabViewHolder.findView(position,convertView,viewGroup); }else{ //直接复用 tabViewHolder = (TabViewHolder)convertView.getTag(); } //这里是处理业务逻辑的方法 tabViewHolder.setView(position); return tabViewHolder.layout;//返回convertView case TYPE_LIST_ITEM: if (convertView == null) { itemViewHolder = new ItemViewHolder(mContext); //给contenView赋值,并给viewHolder设置tag itemViewHolder.findView(position, convertView, viewGroup); } else { //convertView不为空,直接复用 itemViewHolder = (ItemViewHolder) convertView.getTag(); } //处理业务逻辑 itemViewHolder.setView((FeedComment)getItem(position)); return itemViewHolder.layout;//返回convertView case TYPE_UNKNOW: return null; } return null; }
说明:处理复用多个布局的时候,如果不调用上面getViewTypeCount()和getItemType(),很容易就出现viewHolder类型转换错误。因为在屏幕滚动的时候,view.getTag()返回的viewHolder有2种,我们拿到的viewHolder可能就不是理想中的viewHolder,这个时候类型转换错误就出现了。
相关推荐
总的来说,实现Android中ListView多种Item布局的关键在于自定义BaseAdapter,并在`getView()`方法中根据数据动态决定使用哪种布局。聊天界面的实现则需要考虑消息的发送与接收,根据数据的不同属性调整布局样式。这...
1. **创建多种布局**:首先,为每种不同的数据类型或状态创建对应的XML布局文件。例如,如果一个列表既要显示文本又要显示图片,我们可以创建一个包含ImageView和TextView的布局;另一种情况可能只需要TextView。 2...
本篇将深入探讨如何在Android中实现一个模拟聊天界面的ListView,其中包含两种不同的Item布局:一种用于显示发送的消息,另一种用于显示接收的消息。 首先,我们需要理解ListView的基本工作原理。ListView依赖于...
然而,有些情况下我们不仅需要展示单一类型的条目,还可能需要在同一个ListView中混合显示多种布局。本教程将详细讲解如何在ListView中实现这种功能。 首先,我们需要理解ListView的工作原理。ListView通过Adapter...
综上所述,解决Android ListView滚动布局错位的关键在于正确地管理视图类型,并在`getView()`方法中确保视图的复用符合数据的类型。同时,实现多布局时要保持逻辑清晰,避免混淆不同类型的视图。通过这些方法,你...
在Android开发中,ListView是一个非常重要的组件,它用于展示大量数据的列表,具有滚动和复用视图(ViewHolder模式)的特性,极大地提高了性能。这篇博客将深入探讨ListView的使用,包括基本设置、数据适配器、...
综上所述,Android中的ListView是一个强大且灵活的组件,通过适配器和自定义布局,我们可以轻松地创建包含多种类型Item的列表,同时通过各种优化手段提高用户体验。在实际开发中,应根据需求选择合适的Adapter实现...
在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。在实际应用中,我们经常需要根据需求定制ListView,比如改变不同列表项(item)的字体颜色。标题"android 修改listview的不同item字体的颜色...
在Android开发中,ListView是一个非常重要的组件,它用于展示大量数据列表,通常用于实现滚动效果。这个简单的ListView用法例子将帮助初学者理解和掌握如何在实际项目中运用ListView。 首先,我们来了解一下...
在Android开发中,ListView是一个非常重要的组件,它用于展示大量数据集合,并且支持滚动操作。在"android 一些listview例子"这个主题中,我们将会深入探讨ListView的各种使用方法和优化策略。 首先,ListView的...
1. 自定义Adapter:你需要继承BaseAdapter或者ArrayAdapter,并重写其中的方法,如getView(),在这个方法中你可以创建并设置ListView每一项的布局,包括按钮。 2. 设置按钮事件:在getView()方法中,找到Button组件...
综上所述,"Android新闻类界面分享(多种布局的listview)"项目涉及到的核心技术包括自定义Adapter、PopupWindow的使用以及在ListView中处理多种布局。通过这些技术的综合运用,我们可以创建一个功能齐全、体验良好的...
在Android开发中,RecyclerView是一个非常重要的视图组件,它用于展示可滚动的列表,具有高效的数据处理和视图复用机制。本篇文章将深入探讨如何使用RecyclerView加载复杂的多个多种布局,以及如何解决控件复用等...
在Android开发中,ListView是一个非常重要的组件,它用于展示大量数据列表,通常用于实现像通讯录、消息列表等效果。ListView的高效利用是优化用户体验的关键,因为它能够动态加载数据,只渲染屏幕可见的部分,从而...
4. **多种布局类型**:ListView支持多种布局类型,如单行布局、两行布局、网格布局等。通过自定义Adapter,你可以根据数据的不同类型或者用户的选择,动态地改变列表项的布局。例如,可以使用LinearLayout、...
在Android开发中,ListView是一个非常重要的控件,用于展示大量数据的列表形式。它通过复用视图(View)来高效地渲染大量项,从而节省内存并提高性能。本讲解将深入探讨ListView的使用方法、核心组件以及如何优化其...
在Android开发中,ListView是一个非常重要的组件,它用于展示大量数据集合,并且支持滚动操作。本教程通过一个名为"ListApp"的示例项目,详细介绍了如何在Android中使用ListView来构建用户界面并实现基本的功能。 ...
1. **设置ListView的descendantFocusability**:在ListView的XML布局中,可以设置`descendantFocusability`属性为`blocksDescendants`或`beforeDescendants`。这将使ListView允许或优先获取焦点,防止ListView在软...
1. **复用View**:ListView的复用机制是提高性能的关键,通过convertView参数在`getView()`方法中重用不再可见的View,避免频繁创建新对象。 2. **大数据量优化**:当数据量过大时,可以使用分页加载,只加载一部分...
接下来,我们需要创建一个自定义的Adapter来处理多种布局。这个Adapter需要继承自`BaseAdapter`类,重写其中的关键方法。自定义Adapter的核心是`getView()`方法,这里会根据数据项的类型来决定使用哪种布局。为此,...