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

3.5K30
  • 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.5K20

    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文件配置信息 的列表项上绘制的Drawable android:scrollingCache 滚动时是否使用缓存 如果设置为true,则在滚动时将会使用缓存 android...()时,都要重新通过 findViewById() 寻找View组件 & 重新绘制View // 当列表项数据量很大时会严重影响性能,即体现为下拉很慢、卡 /** * 重写方式2:使用convertView

    1.1K10

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

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

    2.2K10

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

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

    34920

    跟我学Android之十一 列表和适配器

    掌握掌握使用各类适配器显示列表数据。 掌握列表视图 ListView 的用法。 掌握下拉视图 Spinner 的用法。...key的内容所对应的显示视图的资源id的数组 使用SimpleAdapter显示复杂数据需要设计好数据内容 u不过视图如何复杂,列表的每一项内容由多个数据字段构成...() { return dataList.size(); } u覆盖getView()方法,用于向列表提供列表项的显示视图 View getView (int position..., View convertView, ViewGroup parent) Ø列表项视图通常有两种方法 l通过布局资源定义,然后采用动态加载的方法使用 l通过程序实现布局 创建自定义适配器...u需要自定义Spinner的列表项视图 u使用自定义列表项视图的办法有多种 Ø通过自定义适配器来使用 Ø通过继承ArrayAdapter

    7810

    跟我学Android之十一 列表和适配器

    了解 AdapterView 的继承关系图 。 掌握掌握使用各类适配器显示列表数据。 掌握列表视图 ListView 的用法。 掌握下拉视图 Spinner 的用法。...ListView控件用于以列表形式显示数据 uListView采用MVC模式将前端显示和后端数据进行了分离 ØListView装载数据时并不使用ListView本身的方法 Ø通过指定一个Adapter...dataList.size();} u覆盖getView()方法,用于向列表提供列表项的显示视图 View getView (int position, View convertView, ViewGroup...parent) Ø列表项视图通常有两种方法 l通过布局资源定义,然后采用动态加载的方法使用 l通过程序实现布局 创建自定义适配器, getView()方法覆盖示例 public View getView...u需要自定义Spinner的列表项视图 u使用自定义列表项视图的办法有多种 Ø通过自定义适配器来使用 Ø通过继承ArrayAdapter,覆盖getDropDownView()方法 实现带图片的Spinner

    7910

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

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

    3.3K10

    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的列表的

    30630

    Android:Fragment + Activity 二合一

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

    69020

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

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

    99030

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

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

    2.4K20

    C#-Xamarin的Android项目开发(二)——控件应用

    GridView 首先,Android的GridView是我见过最奇葩的列表使用方式。。。 然后,我们开始学习使用它把。...其中重写的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中获得第二次) ?

    93130

    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 <?

    46810

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

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

    36110

    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、去除默认的点击选中时的颜色 设置列表layout的backgroudcolor属性就OK了。

    1.4K60

    速读原著-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 类型,这样在列表中显示的内容就可以是一组图片了。

    57510

    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.8K60
    领券