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

Android: ListView中的convertView始终为空

Android中的ListView是一种常用的UI组件,用于展示大量数据列表。在ListView中,convertView是用于重用已经滑出屏幕的列表项视图,以提高性能和减少内存占用。

当ListView滚动时,列表项会进入屏幕或离开屏幕。为了避免每次滚动都创建新的视图对象,Android系统引入了convertView的机制。convertView是一个可复用的视图对象,它在滚动过程中被回收并重新利用。

convertView为空的原因可能有以下几种情况:

  1. 初次加载列表时,convertView还没有被创建。
  2. 列表项的布局发生变化,导致convertView无法复用。
  3. 数据源发生变化,导致convertView无法复用。

为了正确使用convertView,我们需要在适配器的getView()方法中进行判断和处理。当convertView为空时,我们需要通过LayoutInflater来创建新的视图对象,并将其与一个ViewHolder对象绑定。ViewHolder是一个用于存储视图中各个子视图的容器,可以提高列表的滚动性能。

以下是一个示例代码,展示了如何正确使用convertView:

代码语言:txt
复制
public class MyAdapter extends BaseAdapter {
    private List<String> data;
    private LayoutInflater inflater;

    public MyAdapter(Context context, List<String> data) {
        this.data = data;
        inflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return data.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_item, parent, false);
            holder = new ViewHolder();
            holder.textView = convertView.findViewById(R.id.text_view);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        String item = data.get(position);
        holder.textView.setText(item);

        return convertView;
    }

    private static class ViewHolder {
        TextView textView;
    }
}

在上述代码中,我们通过convertView是否为空来判断是否需要创建新的视图对象。如果convertView为空,我们使用LayoutInflater来加载布局文件,并将其与一个ViewHolder对象绑定。如果convertView不为空,我们直接从convertView的Tag中获取ViewHolder对象。

这样,我们就可以正确地使用convertView来提高ListView的性能和内存利用率。

对于这个问题,腾讯云提供了一系列与移动开发相关的产品和服务,例如腾讯移动分析、腾讯移动推送、腾讯移动广告等。您可以根据具体需求选择适合的产品和服务。更多详情请参考腾讯云移动开发相关产品介绍:腾讯云移动开发

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

相关·内容

Android listView异步下载和convertView复用产生错位问题

比如ListView滑动到第2行会异步加载某个图片,但是加载很慢,加载过程ListView已经滑动到了第14行,且滑动过程该图片加载结束。...获取滑入屏幕行item之前会先判断缓存是否有可用item,如果有,做为convertView参数传递给adaptergetView。...这样,如下getView写法就可以充分利用缓存大大提升ListView性能。即便上万个行item,最多inflate次数n, n一屏最多显示ListView 行item个数。...比如ListView滑动到第2行会异步加载某个图片,但是加载很慢,加载过程listView已经滑动到了第14行,且滑动过程该图片加载结束, 第2行已不在屏幕内,根据上面介绍缓存原理,第2行view...比如ListView滑动到第2行会异步加载某个图片,但是加载很慢,加载过程listView已经滑动到了第14行,第2行已不在屏幕内,根据上面介绍缓存原理,第2行view可能被第14行复用,第14行显示了第

1.3K70

ListView优化和列表首尾使用

我们可以看到getView()方法传入了一个参数convertView,可以验证该convertView值有时候是null,有时候又不是null,特别是当用户滚动ListView时候。...其实Recyler可以理解就是一个队列,用来存储不在屏幕范围内item,如果item完全滚粗屏幕范围,那么该item就保存在队列;如果新item要滚动出来,那么就会首先查看Recyler是否含有可以重复使用...其实Recycler缓存item就是getView()方法参数convertView。所以会发现convertView有时候null,有时候不为null。...; } } 经过这样改造后,getView()方法首先检查convertView是否,如果是则新装填一个列表项组件,否则就重用它,就可以避免多余装载导致内存开销。...当convertView 时候,装填一个列表项组件,并同时创建相应ViewHolder对象;当convertView 不为,只需要从其中取出ViewHolder对象,即可轻松给子组件填充内容。

1.5K80

as3ProgressEventbytesTotal始终0

遇到很奇怪问题,as3监听资源下载PROGRESS事件(ProgressEvent.PROGRESS),它bytesLoaded属性倒是正常,但bytesTotal属性却始终0,结果是导致了得到下载比率无穷大...(Infinity) evt.bytesLoaded / evt.bytesTotal  evt.bytesLoaded  / 0 在网上搜索了一下,有以下三种情况导致bytesTotal始终...0: 1、如果将进度事件调度/附加到某个 Socket 对象,则 bytesTotal 将始终 0,参考ProgressEvent事件对象>> 2、从php里动态加载内容导致bytesLoaded...始终0,解决方案>> 3、web服务器开启gzip导致,参考地址>> 因开发环境是在Windows下,而web服务器使用是nginx,然后查看了一下nginx.conf配置,发现gzip是开启...我用httpwatch抓取swf下载,发现其http header在gzip开启情况下还是有的,这种现象很难解释了,gzip对swf加载起到了什么影响?

82310

ListView+GirdView合集

GridView 在二维滚动网格显示项目的视图,它继承属性与 ListView相似,并且 GridView用法很多,主要凸显是网格式布局,既有横向也有纵向数据显示。...android:footerDividersEnabled:当设置false时, ListView不会在每个页脚视图之前绘制分隔符。...android:headerDividersEnabled:当设置false时, ListView不会在每个标题视图之后绘制分隔符。...判断 convertView则创建,并设置tag,否则通过tag来取出 ViewHolder 给 ViewHolder控件设置数据 最终效果如下: ?...嘿嘿,这里就有个问题当 ScrollView嵌套 GridView或 ListView一起用时候会冲突,你会发现 ListView始终显示是第一个 Item而其他 item不见了,其实不是其他

1.8K20

ListView使用技巧-更新

虽然在Android5.X,RecyclerView在很多地方组件取代了ListView,但是ListView使用依然是分广泛。 本博文将对以下两方面的内容进行介绍 1....使用ViewHoder步骤: 1. 在自定义Adapter定义一个内部类ViewHolder,并将Item布局控件作为成员变量 2....当convertView不为时候,直接取出来即可 */ public class ViewHolder { public TextView idtvcontent;...当然,分隔线不仅仅可以设置一个颜色,也可以设置图片资源,分隔线使用代码如下: android:divider="@android:color/holo_green_light"...遍历ListView中所有的Item ListView作为一个ViewGroup,我们提供了操作子View各种方法,最常见就是通过getChildAt()来获取第i个子View,代码如下:

90830

android读取sqlite数据库数据并用listview显示

数据库数据并用listview显示 刚刚接触android,老师给了我了几个班级信息excel,让我做一个考勤系统出来,本篇仅记录了真机调试下,读取已有静态数据库并显示在listview。...实际上Android你缓存了视图,Android中有个叫做Recycler构件,下图是他工作原理 如果你有10亿个项目(item),其中只有可见项目存在内存,其他在Recycler。...ListView先请求一个type1视图(getView)然后请求其他可见项目。convertView在getView(null)。...当item1滚出屏幕,并且一个新项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是值了,它值是item1。..., ViewGroup parent) { View view ; /**对ListView优化,convertView时,创建一个新视图

2.1K20

listview加载性能优化之view复用

android开发Listview是一个很重要组件,它以列表形式根据数据长自适应展示具体内容,用户可以自由定义listview每一列布局,但当listview有大量数据需要加载时候,会占据大量内存...一般我们都会给listview set一个adapter ,然后adapter里面初始化方法就是 getview(),这个方法 简单说是这个意思,就是 你listview有多少行,或者说count值是多少...,他就会走多少次getview().所以 优化listview加载速度就要让convertView匹配列表类型,并最大程度上重新使用convertView。...mIcon1 : mIcon2); return item; } 正确加载方式是当convertView不为时候直接重新使用convertView从而减少了很多不必要View创建,然后加载数据...mIcon1 : mIcon2); return convertView; } 最快方式是定义一个ViewHolder,将convetViewtag设置ViewHolder,不为时重新使用即可

31930

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

ArrayAdapter用法: 简单来讲一下ListView和ArrayAdapter: 我们可以将 ListView 看成由 ArrayAdapter 提供支持,没有该适配器的话 ListView 就是个容器...重复使用它们,ListView 将请求列表特定位置视图,同时传入之前用过视图。...你看过 Android 下拉菜单吗?在 Android ,这些叫做 Spinner,你猜怎么着?...要填充下拉菜单每项,我们其关联了一个适配器,菜单每项都来自数据来源某项,可以看出,当你构建 Android 应用时,就会遇到适配器模式。...当convertViewnull时候,创建一个ViewHolder对象,并将控件实例都存放在ViewHolder里,然后调用ViewsetTag方法,将ViewHolder对象存储在View

2K10

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

另外,也是下面的属性验证做准备~ ---- 2.表头表尾分割线设置: listview作为一个列表控件,他和普通列表一样,可以自己设置表头与表尾: 以及分割线,可供我们设置属性如下: footerDividersEnabled...也正是在这个过程完成了适配器主要转换功能,把数据和资源以开发者想要效果显示出来。也正是getView重复调用,使得ListView使用更为简单和灵活。  ...).show(); 如果你在app中点击某一行item直接会造成程序闪退,并在Android Studio上抛出指针异常: ?...简单地说,Android允许将一个long类型数据附加到任何ListView对象元素上,对,这是附加,实际上你可以选择忽略此值。...这样写法已经成为了Android世界一个通常做法(惯例)。

1.3K20

Android listViewbutton点击事件

大家好,又见面了,我是你们朋友全栈君。 如果listViewitem有button控件,那么如何获取listViewbutton控件?...在listviewlistitem设置事件响应,如果listitem中有button控件,这时候listitem就不会捕获到点击事件,而默认是listitembutton会捕获点击事件。...要想在点击item时生效,只需要设置button非高亮就可以了,如下: android:focusable="false" 或者设置listview高亮,如下: myListView.setFocusable...所在Item位置,通过这个位置就可以得到Item值。...:android在Activity响应ListView内部按钮点击事件两种方法_今人不见古时月,今月曾经照古人博客-CSDN博客 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn

2K10

Adapter与ListView简单应用(下)Android应用界面开发

ListView01 自己思考后,画了2张图,原创! 其实,在数据源每一个object(包含各种Java类),在ListView对应着每一个item(列表每一个横行) ?...ListView02 而Java类对应变量,则可以一 一对应与item布局文件各个属性。 来,编代码,存在一个Data类,表示每一个Item包含内容。...== null){ //如果view未被创建过,且缓存为 mViewHolder = new ViewHolder(); convertView= LayoutInflater.from(getContext...找到其中控件 convertView.setTag(mViewHolder); //将ViewHolder类存储到已经实例化convertView }else { //如果convertView...,我只是在工程目录下放置了一些图片,用于listview显示,当然Data类与list_layout控件是一一对应,可以添加其它两边都可适配各类控件及属性。

60720

androidlistview 优化方法

这个东西做android是必备,我相信你一定也会,但是我写下来目的就是记录一下。 这个东西面试也很多会问到,那么我们怎么回答那?...首先我认为有这么几点: 1、listview在定义时候宽和高最好固定一下,这样可以减少listview测量次数,避免每次加载时候都要去进行测量。...你会看到日志始终是这几个数据(如果你页面显示5个那个这里数据就应该是六条会比显示数据多一条)。...其实这样做有个问题listview item如果有图片快速滑动你会发现错位问题,当然这些问题第三方加载框架一般都可以解决。...listview item尽量减少布局嵌套 还有大图片加载 容易oom。listview 优化差不多就这些,如果还有其他更好优化方法,欢迎留言。

32530
领券