首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当使用两种不同的列表项目时,列表视图的getView()不能正常工作

当使用两种不同的列表项目时,列表视图的getView()方法可能无法正常工作的原因是,该方法在绘制列表项时会重用已存在的视图对象,以提高性能和内存效率。但是,如果列表中存在多种不同的视图类型,例如不同的布局或样式,那么在重用视图对象时可能会出现类型不匹配的情况,导致getView()方法无法正确地为每个列表项设置正确的视图。

为了解决这个问题,可以通过以下步骤来确保getView()方法正常工作:

  1. 在适配器中使用getItemViewType()方法来返回不同视图类型的标识符。这个方法根据列表项的位置或其他条件来确定应该使用哪种视图类型。
  2. 在getView()方法中根据getItemViewType()返回的视图类型标识符来判断当前需要创建或重用的视图类型,并进行相应的处理。
  3. 如果当前的convertView为空,即没有可重用的视图对象,可以根据视图类型标识符使用LayoutInflater来创建新的视图对象。
  4. 如果当前的convertView不为空,即存在可重用的视图对象,需要根据视图类型标识符来判断该视图对象的类型是否与当前需要的类型匹配。如果不匹配,则需要使用LayoutInflater重新创建一个新的视图对象。
  5. 在getView()方法中,根据当前的视图类型标识符,为每个列表项设置正确的视图内容和样式。

以下是一个示例代码,展示了如何在使用两种不同的列表项目时正确使用getView()方法:

代码语言:txt
复制
@Override
public int getItemViewType(int position) {
    // 根据列表项的位置或其他条件返回不同的视图类型标识符
    if (position % 2 == 0) {
        return 0; // 第一种视图类型
    } else {
        return 1; // 第二种视图类型
    }
}

@Override
public int getViewTypeCount() {
    return 2; // 总共有两种不同的视图类型
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    int viewType = getItemViewType(position);

    if (convertView == null) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());

        // 根据视图类型标识符创建新的视图对象
        if (viewType == 0) {
            convertView = inflater.inflate(R.layout.list_item_type1, parent, false);
        } else {
            convertView = inflater.inflate(R.layout.list_item_type2, parent, false);
        }
    }

    // 根据当前的视图类型标识符为列表项设置正确的视图内容和样式
    if (viewType == 0) {
        // 设置第一种视图类型的内容和样式
        TextView textView = convertView.findViewById(R.id.text_view_type1);
        textView.setText("Type 1");
    } else {
        // 设置第二种视图类型的内容和样式
        TextView textView = convertView.findViewById(R.id.text_view_type2);
        textView.setText("Type 2");
    }

    return convertView;
}

在这个示例中,我们通过getItemViewType()方法返回不同的视图类型标识符,然后在getView()方法中根据这个标识符来创建或重用相应的视图对象,并为每个列表项设置正确的内容和样式。

对于腾讯云相关产品和产品介绍链接地址,由于不能提及具体的品牌商,建议您参考腾讯云官方网站或文档,以获取与云计算相关的产品和服务信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ListView优化和列表首尾使用

一、使用convertView 前面讲自定义ArrayAdapter和自定义BaseAdapter,都会重写getView()方法,虽然可以正常使用,但其实效率非常低。...当然这是不可能,毕竟Android系统内存有限,不可能无限新建列表项组件。实际上Android缓存了视图组件,由于Android系统中有一个Recycler构件,其工作原理如下图所示。...三、列表头和列表使用 在实际使用ListView,经常会有这样需求:位于ListView最顶部时候,显示一个搜索框可以搜索列表内容,或者显示下拉刷新;位于ListView最底部时候...由于这显示内容同ListView列表项内容不同,可以通过控制position来实现效果,但是非常繁琐,当然Android中提供了ListView列表头和列表尾功能。...给ListView添加HeadView和FootView,ListView滑动至列表第一项使HeadView滑动出现,ListView滑动至列表最后一项使FootView滑动出现。

1.5K80

Android开发:ListView、AdapterView、RecyclerView全面解析

工作原理:屏幕需要显示x个item,那么ListView只会创建x+1个视图第一个item离开屏幕,此itemview就会被拿来重用(用于显示下一个item(即第x+1个)内容)。...工作原理实例 假如屏幕只能显示7个item,那么ListView只会创建(7+1)个item视图第1个item离开屏幕,此itemview就会被拿来重用(用于显示第8个item内容)。...生成方式 生成列表视图(ListView)方式主要有两种: - 直接用ListView进行创建 - 让Activity继承ListActivity 2. xml文件配置信息 <LinearLayout...android:listSelector 指定被选中列表项上绘制Drawable android:scrollingCache 滚动是否使用缓存 如果设置为true,则在滚动将会使用缓存 android...工作原理 屏幕需要显示x个item,那么ListView只会创建x+1个视图第一个item离开屏幕,此itemview就会被拿来重用(用于显示下一个item(即第x+1个)内容)。

3.4K30

ListView详细介绍与使用

ListView 简介 ListView 是 Android 系统为我们提供一种列表显示一种控件,使用它可以用来显示我们常见列表形式。继承自抽象类 AdapterView。...工作原理 ListView 仅是作为容器(列表),用于装载显示数据(就是上面的一个个红色框内容,也称为 item)。item 中具体数据是由适配器(adapter)来提供。...假如屏幕一次可以显示 x 个 item (不用是完整),那么 ListView 会创建 x+1 个视图第1个 item 离开屏幕时候,此时这个 item View 就会被回收,再入屏...如果 item 中布局有点复杂的话,item 中每个控件又需要设置不同值,那么 item 中每个布局内容就又对应 HashMap 中值了。...长度逐一绘制 ListView 每一行 获取数据,通过 getItem() getItemId() 来获取 Adapter 中数据 重点看一下 getView 实现方式一: 直接返回索引对应数据视图

1.4K20

Carson带你学Android:全面解析列表ListView与AdapterView

):作为View 和 数据之间桥梁 & 中介,将数据映射到要展示View中 需显示数据,ListView会向Adapter取出数据,从而加载显示,具体如下图 结论 ListView负责以列表形式显示...,ListView不会为每一个数据创建一个视图,而是采用了Recycler组件,用于回收 & 复用 View 屏幕需显示x个Item,那么ListView会创建 x+1个视图第1个Item...生成方式 生成列表视图(ListView)方式主要有两种: 直接用ListView进行创建 让Activity继承ListActivity 2. xml文件配置信息 <LinearLayout xmlns...android:listSelector 指定被选中列表项上绘制Drawable android:scrollingCache 滚动是否使用缓存 如果设置为true,则在滚动将会使用缓存 android...(),都要重新通过 findViewById() 寻找View组件 & 重新绘制View // 列表项数据量很大时会严重影响性能,即体现为下拉很慢、卡 /** * 重写方式2:使用convertView

1K10

android学习笔记----ListView和各种适配器简介

ArrayAdapter具有说明来告诉它自己如何创建列表视图,并返回给ListView,屏幕被占满后 ListView 将停止向ArrayAdapter 寻求更多列表项,列表视图仅在需要才创建...,视图被滚动离开屏幕后,它们就会被添加到Scrap Pile,比如前两个列表项不再可见,它们将进入 Scrap Pile,然后当我们请求新列表,我们可以通过将这些视图再返回到 ArrayAdapter...重复使用它们,ListView 将请求列表中特定位置视图,同时传入之前用过视图。...比如,ListView 请求是位置 6 处项,并向 ArrayAdapter 传入可重复使用以前视图,ArrayAdapter 可以通过在回收过视图里放入数据,使用回收视图,然后再接着比如通过调用...ArrayAdapter填充单个TextView使用第二个参数。因为这是我们自定义适配器,所以适配器将不使用第二个参数,因此它可以是任何值。在这里,我们使用0。

2.1K10

【Android从零单排系列四十六】《Android中自定义ListView实现方法》

一  ListView 介绍 ListView 是 Android 中经典列表控件,用于展示一组垂直滚动项目。...二  ListView缺点 ListView 在 Android 中是一个经典列表控件,但也存在一些限制和缺点,包括: 性能问题:ListView 对于大量数据展示可能存在性能问题,特别是列表项变得复杂或包含大量视图元素...虽然可以通过自定义适配器来定制每个列表外观,但对于不同类型列表项布局,ListView 并不提供直接支持。为了实现更复杂布局需求,可能需要使用其他控件或库。...固定高度限制:ListView 默认情况下要求每个列表项具有相同高度,这限制了列表灵活性。如果列表项高度不同,需要重写适配器来处理不同高度情况。...运行应用程序后,您将看到一个显示列表自定义列表视图。 通过在 CustomAdapter 类中添加更多逻辑和布局定义,您可以根据需求定制每个列表外观和功能。

28220

TabLayout+ViewPager+Fragment实现切页展示「建议收藏」

使用两种PagerAdapter差别分析及选择。 懒加载策略。 卡顿及性能优化建议。...一般情况下上面四个章节内容足以应付过来,但是往往在一些特殊情况下,仍然会遇到一些不能解决问题,这时就需要深入到源码之中来具体问题具体分析。话不多说,接下来将进行使用总结。...超出这个limit范围Fragment就会被销毁,而上述两种PagerAdapter差别就是销毁流程不同!...就是被动加载,Fragment页面可见,才从网络加载数据并显示出来。那什么时候Fragment可见呢?...后者卡顿通过懒加载形式能够完美解决,而前者因实例创建引起的卡顿则提出了三种不同优化选择,应该说,每一种方案都有利有弊,并没有绝对好与不好,在项目运用中,还是得根据需求和实际情况来进行选择,当然,要从内存泄漏

2.1K10

2014-10-27Android学习------程序源码+知识总结------城市列表应用程序

csdn 上,地址:http://download.csdn.net/detail/u014737138/8100691 接下来需要补充下这个应用项目中我们还没有学习完知识点: 1.视图更新...();这样一个函数: 1).invalidate()是用来刷新View,必须是在UI线程中进行工作。...3、setVisibility()方法 : View可视状态在INVISIBLE转换VISIBLE,会间接调用invalidate()方法, 继而绘制该View...说白了就是注意一点:invalidate不能再线程中直接使用,但是可以在UI线程中直接使用,postinvalidate可以直接在线程中使用 我们在应用程序中类是继承View,它就是一个UI线程,那么它就可以直接使用了...(int position, View convertView, ViewGroup parent) { } 其中以getView尤为重要,非常重要,它是负责刷新ListView列表

29130

Android开发笔记(三十八)列表视图

Adapter 适配器Adapter与适配视图是配合使用,每个适配类视图都要搭配相应适配器,才能够正常工作。...spinnerMode只能在xml中设置,不能在代码中设置。 代码中方法: setPrompt : 设置标题文字。 setPromptId : 设置标题视图资源ID。...总结ListView属性设置有两个注意点(不知算不算Androidbug,呵呵): 1、divider设置为@null,就不能再设置dividerHeight为非0值,不然列表末尾元素显示有问题...; 2、不管是否指定headerDividersEnabled,列表上方分隔线都不会显示; ListView使用方式 Android提供了两种使用ListView方式: 1、ListActivity...两种使用方式区别如下: 1、ListActivity方式视图id被设置为系统id,不方便在代码中修改该列表视图属性; 2、ListActivity方式只实现点击方法、未实现长按方法,不方便响应列表长按事件

2.3K20

Android:Fragment + Activity 二合一

二合一:Activity内Fragment数大于1,滑动finish是Fragment,如果小于等于1,finish是Activity。...,FragmentManager也会为你保存Fragment,重启app,我们可以从FragmentManager中获取这些Fragment。...当我们拖拽,上个Fragment AView是GONE状态,所以我们要做就是判断拖拽发生,Fragment AView设置为VISIBLE状态,这样拖拽时候,上个Fragment A就被完好显示出来了...原因在于: SwipeBackFragment库是一个仅实现Fragment&Activity拖拽返回基础库,适合轻度使用Fragment小伙伴(项目属于多Activity+多Fragment,Fragment...Fragmentation主要是在项目结构为 单Activity+多Fragment,或者重度使用Fragment多Activity+多Fragment结构一个Fragment帮助库,Fragment-SwipeBack

65220

Android开发:实现滑动退出 Fragment + Activity 二合一

二合一:Activity内Fragment数大于1,滑动finish是Fragment,如果小于等于1,finish是Activity。...,重启app,我们可以从FragmentManager中获取这些Fragment。...当我们拖拽,上个Fragment AView是GONE状态,所以我们要做就是判断拖拽发生,Fragment AView设置为VISIBLE状态,这样拖拽时候,上个Fragment A就被完好显示出来了...原因在于: SwipeBackFragment库是一个仅实现Fragment&Activity拖拽返回基础库,适合轻度使用Fragment小伙伴(项目属于多Activity+多Fragment,...Fragmentation主要是在项目结构为 单Activity+多Fragment,或者重度使用Fragment多Activity+多Fragment结构一个Fragment帮助库,Fragment-SwipeBack

88530

C#-XamarinAndroid项目开发(二)——控件应用

GridView 首先,AndroidGridView是我见过最奇葩列表使用方式。。。 然后,我们开始学习使用它把。...其中重写Count属性需要特别注意,他代表我们列表显示数,他是需要赋值。这里事例为其定义了一个常数9。 接下来我们重点看下GetView方法。...因为,至于为什么会叫GetView,我想,大概是因为他即干了行绑定数据事,又干了行视图布局事,所以没有更合适命名,才这么叫吧。...这也是为什么我感觉他奇葩原因,因为在之前Activity和布局中已经混淆了视图和数据,然后,在控件里,我们又一次把数据和布局搅和在了一起。。。。 下面我们看看它是如何混淆,不,他是如何工作吧。...然后,我们通过paramInt来判断当前行,正常情况,在这里找到Activity数据集合,找到集合对应行赋值即可了。 Demo里我们做了一下特殊处理,我们为行视图添加了图片。

1.3K40

Android开发之漫漫长途 XIV——ListView

那么本篇我们来说一下ListView,虽然现在ListView逐渐被RecyclerView取代,包括我自己项目中也是使用RecyclerView。那么为什么要分析一个“过时”东西呢?...因为RecyclerView前辈,许多遗留项目是基于ListView,可能因为种种原因不能更换或者更换代价太大,那么我们如何在ListView基础上优化App就成了我们不得不面对问题。...在面试初中级Android开发工程师时候,关于列表项展示这块基本上是必问,你如果使用ListView,那么ListView性能优化,以及后面要讲到下拉刷新上拉加载,基本也是必问,因为这是你平常项目开发中也是肯定要考虑到点...*ScrapViews是可以被适配器使用视图,以避免不必要地分配视图。...视图如果被发现,就会从mActiveViews删除,也就是说不能从同一个位置View不能从mActiveViews中获得第二次) ?

86730

2-VI--ListView基本使用及优化

滑动很快,不断创建View条目,会卡卡 ---- 二、优化1、使用convertView 1.关于convertView源码注释: The old view to reuse, if possible...如果它果不能转换这个视图来显示正确数据,这个方法能创建一个新View Heterogeneous lists can specify their number of view types, so that...this View is always of the right type 不均匀列表可以指定它们视图类型数量,因此这个视图总是正确类型 2.修改:MyListViewAdapter#getView...滑动非常非常快,会有一点点会卡 ---- 三、优化2、使用ViewHolder 曾经我纳闷,好好用ViewHolder干嘛,convertView之后已经很好了啊 现在明白:每个item创建都会执行...findViewById和创建ViewHolder 数据200000条,测试滑动非常非常非常快,感觉良好 ---- 附录、布局: activity_main.xml <?

44910

设计模式学习之适配器模式

定义及使用场景 定义:适配器模式把一个类接口变换成客户端所期待另一种接口,从而使原本因接口不匹配无法在一起工作两个类可以在一起工作。...适配器模式从实现方式上分为两种,类适配器和对象适配器,这两种区别在于实现方式上不同,一种采用继承,一种采用组合方式。...另外从使用目的上来说,也可以分为两种,特殊适配器和缺省适配器,这两种区别在于使用目的上不同,一种为了复用原有的代码并适配当前接口,一种为了提供缺省实现,避免子类需要实现不该实现方法。...1.对于类适配器,由于适配器直接继承了Adaptee,使得适配器不能和Adaptee子类一起工作,因为继承是静态关系,适配器继承了Adaptee后,就不可能再去处理 Adaptee子类了。...定制适配器与缺省适配器 根据目的不同,适配器模式也可以分为两种,那么上述便是第一种,可称为定制适配器,还有另外一种称为缺省适配器。

33810

Android开发之ListView使用经验分享

在Android开发中,ListView是使用最广泛组件之一,虽然谷歌推出了RecycleView,但是很多项目中依旧在使用ListView,本文将总结一下使用过程中遇到一些问题,与大家共勉~~~...>> data, int resource, String[] from, int[] to) 参数含义: context:关联SimpleAdapter运行着视图上下文。...那么在加载列表,需要通过组件id和data参数中List元素中Map对象对应) from: 参数是Map对象key to :表示组件id (假设from = new String[]{"userId...position和id值是一样 注意: 在点击事件中,经常遇到一个坑是:ListView不能响应onItemClick事件 发生原因:listview中包含button,checkbox等控件时候...1、去除默认点击选中颜色 设置列表layoutbackgroudcolor属性就OK了。

1.3K60

速读原著-Android应用开发入门教程(列表(List)视图组)

8.6 列表(List)视图组 本节介绍列表(List)视图组可以将某种控件按照列表形式组织起来,它与网格视图组类似,但是附加了更方便组织方式。...widget.Adapter> => android.widget.AbsListView => android.widget.ListView ListView 也扩展了 AbsListView,列表视图使用方法和网格视图具有很相似的共同点...在使用列表类 ListView 通常使用 ListActivity 来代替 Activity,ListActivity 扩展了 Activity 可以方便 ListView使用,主要方法包括以下几个...ListActivity 类实际上集成了 Activity 和 ListView 功能,其内部包含了一个 ListView,使用这个类可以直接构造界面中列表视图。...省略部分内容 } 这里 getView()函数所返回是 ImageView 类型,这样在列表中显示内容就可以是一组图片了。

54710

Android Material Design系列之FloatingActionButton和Snackbar

这个系列都是主讲Material Design风格控件,所以都是控件一些基本使用,也会扩展讲一些与这个控件相关东西和效果,如果都会了同学,可以不看这个系列。...默认正常显示背景颜色 app:elevation :FloatingActionButton阴影深度,默认阴影 app:rippleColor:FloatingActionButton点击背景颜色...那我们现在就研究改如何在滑动列表隐藏和显示这个悬浮按钮FloatingActionButton。...FloatingActionButton显示与隐藏 那如何实现滑动列表,下滑显示和上滑隐藏效果呢?...其实改变Snackbar位置和设置icon位置布局大同小异,代码如下: // 获取 snackbar 视图 View snackbarView = snackbar.getView(); ViewGroup.LayoutParams

1.6K60

Andorid-ListView简单使用以及BaseAdapter入门

---- 3.列表从底部开始显示:stackFromBottom 如果你想让列表显示你列表最下面的话,那么你可以使用这个属性,将stackFromBottom 属性设置为true即可,设置后效果图如下...也正是在这个过程中完成了适配器主要转换功能,把数据和资源以开发者想要效果显示出来。也正是getView重复调用,使得ListView使用更为简单和灵活。  ...比如:没有完成getItemId方法功能实现的话,调用ListViewgetItemIdAtPosition方法将会得不到想要结果,因为该方法就是调用了对应适配器getItemId方法。...* 这里需要注意一点是对于一个元素ID实际上和position不能认为是一个东西,实际上可以是完全不同值 */ @Override public long getItemId...如果你嫌英语太麻烦,那么可以直接看我对此理解:  首先我们要理解一点,为何使用Adapter适配器,Adapter就是给我们视图资源在调用数据时候能够相当程度上方便,视图只需要直接和Adapter交互

1.3K20

让 Android 开发像 web 开发一样爽

作者:hanks https://juejin.im/post/5bf12c8751882511a8527ed4 做移动端开发,最蛋疼就是不能动态发版,不能像 web 那样发版立即全部用户生效,然而...lua 是一种脚本语言,使用 lua 来构建跨平台原生应用有许多好处,比如 lua 语言简洁高效,可移植性好, Lua虚拟机极为轻量,仅占用200到300k内存空间,且速度极快。...屏幕中上半部分是 Android xml 布局中写好代码,点击运行按钮,加载 lua 脚本,返回一个 View 对象,然后添加到布局中。一个简单 lua 脚本编写视图就写好了。...Lua 是用 c 语言开发,可移植性比较好,想支持 iOS 的话,原理一样,不过参考目前已有的跨平台技术。...关于跨平台方面的一些个人见解,目前已有的跨平台技术每当涉及到不同平台特性,事情就比较蛋疼了,需要单独去适配,还有建立一堆连接库,比如选取本地图片,不同平台数据库,平台特有 api,真是一份代码到处运行终是梦

60320
领券