`

android ListView中的convertView缓存及使用

 
阅读更多
一、复用convertView

首先讲下ListView的原理:ListView中的每一个Item显示都需要Adapter调用一次getView的方法,这个方法会传入一个convertView的参数,返回的View就是这个Item显示的View。如果当Item的数量足够大,再为每一个Item都创建一个View对象,必将占用很多内存,创建View对象(mInflater.inflate(R.layout.lv_item, null);从xml中生成View,这是属于IO操作)也是耗时操作,所以必将影响性能。Android提供了一个叫做Recycler(反复循环器)的构件,就是当ListView的Item从上方滚出屏幕视角之外,对应Item的View会被缓存到Recycler中,相应的会从下方生成一个Item,而此时调用的getView中的convertView参数就是滚出屏幕的Item的View,所以说如果能重用这个convertView,就会大大改善性能。

一个屏幕最多显示7个Item,如果当Item1滑出屏幕,此时Item1的View被添加进Recycler中,相应的在下部要产生一个Item8,这时调用getView方法,convertView参数就是Item1的View。

(1)Item固定高度

public View getView(int position, View convertView, ViewGroup parent) {
    System.out.println("getView " + position + " " + convertView);
    ViewHolder holder = null;
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.lv_item, null);
        holder = new ViewHolder();
        holder.textView = (TextView)convertView.findViewById(R.id.tv_text);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder)convertView.getTag();
    }
    holder.textView.setText(mData.get(position));
    return convertView;
}


(2)Item高度不固定

因为没有固定的Item高度,无法计算一个屏幕中能够显示的最大高度,系统会会先创建一个View,第一轮是用这个View来试探能放多少个item,试探出结果可以放3个Item,所以第二轮的0-2才是真正创建的View,屏幕上显示了3个Item。当往下滚时,Item0没有完全出去,下面有来了个Item3,所以这时的Item有创建了一个View,屏幕上此时显示4个Item。之后4个Item就是做多显示的数量,再往上滚动,convertView就开始重用了,Item4和Item0的View是一个对象。

二、使用ViewHolder类

我们都知道在getView方法中的操作是这样的:先从xml中创建view对象(inflate操作,我们采用了重用convertView方法优化),然后在这个view去findViewById,找到每一个子View,如:一个TextView等。这里的findViewById操作是一个树查找过程,也是一个耗时的操作,所以这里也需要优化,就是使用viewHolder,把每一个子View都放在Holder中,当第一次创建convertView对象时,把这些子view找出来。然后用convertView的setTag将viewHolder设置到Tag中,以便系统第二次绘制ListView时从Tag中取出。当第二次重用convertView时,只需从convertView中getTag取出来就可以。

public View getView(int position, View convertView, ViewGroup parent) {
         System.out.println("getView " + position + " " + convertView);
         ViewHolder holder = null;
         if (convertView == null) {
             convertView = mInflater.inflate(R.layout.lv_item, null);
             holder = new ViewHolder();
             holder.textView = (TextView)convertView.findViewById(R.id.tv_text);
             convertView.setTag(holder);
         } else {
             holder = (ViewHolder)convertView.getTag();
         }
         holder.textView.setText(mData.get(position));
         return convertView;
     }
}
 
 public static class ViewHolder {
     public TextView textView;
 }


注意:缓存的是item中的layout布局文件信息 而不是列表内容

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    listView中多个listItem布局时,convertView缓存及使用

    在Android开发中,ListView是一种常见的组件,用于展示大量的数据列表。在处理多个listItem布局时,为了提高性能和效率,ListView引入了convertView机制。这个机制是通过缓存已创建但不再可视的listItem视图来避免...

    Android listview 分组及折叠分组

    在Android开发中,ListView是一种常用的视图组件,用于展示大量数据列表。在某些场景下,我们可能需要将数据按照特定的逻辑进行分组,并且允许用户折叠或展开这些分组,以便更好地管理和浏览数据。本篇文章将深入...

    Android ListView实例源码

    这个实例源码“Test_Golf1”很可能包含了一个完整的ListView应用示例,帮助开发者理解如何在Android中有效地使用ListView。下面将详细阐述ListView的相关知识点。 1. **ListView基本使用**: - `ListView`是...

    android listview

    在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表。本篇文章将深入探讨“android listview”相关的知识点,包括横向ListView、微信风格的ListView以及XListView的优化。 首先,我们来看“横向...

    android listView 改变选中行的 字体颜色和 图片

    在Android开发中,ListView是一种常用的组件,用于展示可滚动的多行数据列表。要改变ListView选中行的字体颜色和图片,我们需要理解ListView的工作原理,以及如何自定义其Adapter和视图。以下是一些关键知识点的详细...

    Android ListView控件的使用(自定义适配器 + ListView + 解决OOM )

    在Android开发中,ListView是一个非常重要的控件,用于展示大量数据列表。本教程将深入讲解如何使用ListView,结合自定义适配器以及解决Out-Of-Memory(OOM)问题。 首先,`ListView`是一个可滚动的视图,它能够...

    Android ListView扩展(图片+文字)

    在Android应用开发中,ListView是常用的控件,用于展示大量数据列表。本示例将深入讲解如何在ListView中实现图片和文字的结合显示,以增强用户体验。我们将使用Android Studio 3.1.4进行开发。 首先,理解ListView...

    android listview的使用方法

    本篇文章将深入探讨如何在Android中使用ListView,包括基本配置、适配器(Adapter)的使用以及一些优化技巧。 首先,我们需要在布局文件中添加ListView元素。在XML布局中,你可以这样定义一个ListView: ```xml ...

    android 中ListView下载图片

    在Android开发中,ListView是一种非常常见且重要的组件,它用于展示大量的列表数据。在实际应用中,我们常常需要在ListView的每个列表项中显示图片,这涉及到图片的异步加载技术,以避免阻塞主线程导致应用卡顿或...

    Android ListView实现各种版面设计功能 源码

    在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表。本资源"Android ListView实现各种版面设计功能 源码"聚焦于如何利用ListView实现多样化的版面设计,提升用户界面的视觉效果和交互体验。核心...

    android listview 高效显示网络图片,自定义listview布局

    在Android开发中,ListView是一种常用的组件,用于展示大量的数据列表。然而,当ListView中的每一项都需要显示网络图片时,如果不进行优化,可能会导致性能问题,如界面卡顿、滚动不流畅等。这个问题的解决方法是...

    Android ListView详细demo源码

    - **ViewHolder模式**:在`getView()`方法中使用ViewHolder缓存子View的引用,减少findViewById的调用,提升性能。 - **复用机制**:ListView默认会复用滑出屏幕的列表项,减少新创建View的次数。 - **大数据量时...

    ListView中动态添加数据

    在Android开发中,ListView是一种常用的UI组件,它允许开发者显示一组长列表的数据,通常用于展示大量可滚动的信息。本篇文章将深入探讨如何在ListView中动态添加数据,这在实际应用中是非常常见且重要的功能。 ...

    android listview demo

    "android listview demo"通常指的是一个示例项目,展示了如何在Android应用中有效地使用ListView。在这个demo中,开发者可能会涵盖以下几个关键知识点: 1. **ListView基本用法**:ListView是Android SDK中的一个...

    android ListView子控件监听

    在Android开发中,ListView是常用的一种视图组件,它能够展示大量的数据并支持滚动操作。在实际应用中,我们经常需要对ListView中的每个子项(Item)进行交互处理,例如点击事件、长按事件等。这就涉及到如何监听...

    ListView缓存机制

    当需要创建新的item View时,ListView首先会尝试从缓存池中取出一个已经存在的View进行复用,这就是convertView。 2. ** ViewHolder模式 **:为了进一步优化性能,开发者通常会使用ViewHolder设计模式。ViewHolder...

    listview的上拉加载下拉刷新+本地缓存+简单的头尾布局

    6. 优化与性能:ListView的高效性在于其复用机制,通过convertView在滚动过程中重用不再显示的View。因此,需要确保每个列表项的布局尽可能简洁,避免复杂的嵌套布局和过多的计算,以降低内存消耗和提高滚动流畅度。...

    android listview mvp

    - 使用ViewHolder:ViewHolder模式是ListView优化的关键,它通过缓存convertView的子视图引用,避免了每次创建新视图时的findViewById操作,提高了列表滚动的流畅性。在Adapter的getView()方法中,首先检查传入的...

Global site tag (gtag.js) - Google Analytics