Adapter的getView方法详解

2023-11-07

BaseAdapter就Android应用程序中经常用到的基础数据适配器,它的主要用途是将一组数据传到像ListView、Spinner、Gallery及GridView等UI显示组件,它是继承自接口类Adapter,我们经常使用的ListView 的adapter,即SimpleAdapter,是继承自BaseAdapter的,BaseAdapter是一个基类,没有实现绑定数据的功能,SimpleAdapter实现了基本控件的绑定,如TextView,Button,ImageView).已经为我们实现好了数据优化工作,这些适配器使用相同组件动态绑定数据的方式进行优化。为什么需要优化呢?因为如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?这不可能,因为内存有限制。实际上Android为你缓存了视图。Android中有个叫做Recycler的构件,下图是他的工作原理:


如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中。其实我的理解Recyler就是一个队列,用来存储不在屏幕范围内的item,如果item滚出屏幕范围,那么就入队,这里的滚出是完全滚出,即边界等也要完全滚出。如果新的item要滚进来,那么android系统的framework就会查看Recyler是否含有可以重复使用的iew,如果有那么就重新设置该iew 的数据源,然后显示,即出队。那么这么多的item其实只需要占用一定空间的内存,这个内存大小是多少呢?我的感觉是手机屏幕所包含的item的个数,再加上1,然后乘以每个item占用的内存。但是最后我发现是加上2.可能是为了使得缓存更大吧。。。。但是为什么加上2,大家应该理解,如果你不理解,那你就把滚动list的过程好好想一想。那个队列无非就是一个缓存罢了,因为我们的目的是通过那个缓存来重复使用那些已经创建的iew。

使用BaseAdapter的话需要重载四个方法,这些方法分别是getCount,getItem,getItemId,最后一个最重要的是getView,getView函数为什么重要呢?因为它是用来刷新它所在的ListView的。它在什么时候调用的呢?就是在每一次item从屏幕外滑进屏幕内的时候,或者程序刚开始的时候创建第一屏item的时候。看getView的api:

public abstract View getView (int position, View convertView, ViewGroup parent)

Since: API Level 1

Get a View that displays the data at the specified position in the data set. You can either create a View manually or inflate it from an XML layout file. When the View is inflated, the parent View (GridView, ListView...) will apply default layout parameters unless you use inflate(int, android.view.ViewGroup, boolean) to specify a root view and to prevent attachment to the root.

Parameters
position The position of the item within the adapter's data set of the item whose view we want.
convertView The old view to reuse, if possible. Note: You should check that this view is non-null and of an appropriate type before using. If it is not possible to convert this view to display the correct data, this method can create a new view. Heterogeneous lists can specify their number of view types, so that this View is always of the right type (see getViewTypeCount() and getItemViewType(int)).
parent The parent that this view will eventually be attached to
Returns
  • A View corresponding to the data at the specified position.
position是指当前dataset的位置,通过getCount和getItem来使用。如果list向下滑动的话那么就是最低端的item的位置,如果是向上滑动的话那就是最上端的item的位置。conert是指可以重用的视图,即刚刚出队的视图。parent应该就是list。

为了让大家更好的理解这个函数,写了一个程序,请看:

public class MainActivity extends Activity {


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView lv = (ListView)findViewById(R.id.listview);
        ArrayList<String> listdata = new ArrayList<String>();
        for(int i=0;i<400;i++){
         listdata.add("Item" + i);
        }
        lv.setAdapter(new MyAdapter(this, listdata));
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    public class MyAdapter extends BaseAdapter{
     private ArrayList<String> listdata;
     private Context context;
    
     public MyAdapter(Context context,ArrayList<String> listdata){
     this.context = context;
     this.listdata = listdata;
     }
@Override
public int getCount() {
// TODO Auto-generated method stub
return listdata.size();
}


@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return listdata.get(arg0);
}


@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}


@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
Log.i("position",arg0+"");
TextView tmView;
String temstr;
if(arg1 == null){
TextView tm = new TextView(context);
tmView = tm;
tmView.setTag("old" + arg0);
tmView.setText(listdata.get(arg0));
}else {
tmView = (TextView)arg1;
tmView.setText(listdata.get(arg0) + "\t" + arg1.getTag());
}

return tmView;
}
    
    }

}

从log中大家好好观察相关的输出结果,便可以将其理解

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Adapter的getView方法详解 的相关文章

  • Android Studio 3.0 Canary 9 - 无法解析包

    我在 Android Studio 3 0 Canary 9 中遇到几个错误 这些错误是 无法解析 android 软件包 下面列出了一些错误 我刚刚安装了 SDK 的所有额外软件包 但仍然收到 gradle 构建错误 Error 82 1
  • 使用workmanager时Firestore脱机持久性错误

    我正在使用一个WorkManger定期从我的中检索信息Firestore当应用程序处于后台和前台时的数据库 此信息用于根据状态更新 UI 因此不同的状态会添加或删除 UI 的不同部分 第一次运行时效果很好 但是 一旦应用程序处于后台并且Wo
  • 如何重试已消耗的 Observable?

    我正在尝试重新执行失败的已定义可观察对象 一起使用 Retrofit2 和 RxJava2 我想在单击按钮时重试特定请求及其订阅和行为 那可能吗 service excecuteLoginService url tokenModel Ret
  • SearchView过滤ListView

    我已经实现了搜索视图来过滤我的列表视图项目 当我输入任何文本时 它会过滤列表 但当我退出搜索视图时 它不会返回原始列表项 public class PlacesListAdapter extends ArrayAdapter
  • 无法获取log.d或输出Robolectrict + gradle

    有没有人能够将 System out 或 Log d 跟踪从 robolectric 测试输出到 gradle 控制台 我在用Robolectric Gradle 测试插件 https github com robolectric robo
  • 谷歌坐标认证

    当我尝试连接到 Google 坐标时 总是出现异常GoogleAuthException 我拥有 Google 地图协调中心许可证 我确实使用我的包应用程序名称和 SHA1 在 google 控制台中创建了我的客户端 ID 我将权限添加到清
  • Android Activity 生命周期函数基础知识

    我正在测试这段代码 它显示活动所处的状态 public class Activity101Activity extends Activity String tag Lifecycle Called when the activity is
  • Android 中 Kotlin 协程的正确使用方式

    我正在尝试使用异步更新适配器内的列表 我可以看到有太多的样板 这是使用 Kotlin 协程的正确方法吗 这个可以进一步优化吗 fun loadListOfMediaInAsync async CommonPool try Long runn
  • CollapsingToolBarLayout - 状态栏稀松布颜色不改变

    几天前我更新了我的 android studio 并开始使用 CoordinatorLayout 和 CollapsingToolbarLayout 只是尝试一些东西 工具栏稀松布颜色似乎覆盖了状态栏初始颜色和状态栏稀松布颜色 从 xml
  • 尝试将相机切换回前面但出现异常

    尝试将相机切换回前面 但出现异常 找不到 问题请检查并帮助 error 01 27 11 49 00 376 E AndroidRuntime 30767 java lang RuntimeException Unable to start
  • 如何使用 IF 检查 TextView 可见性

    我有一个 onCheckedChangeListener 来根据选择的单选按钮显示文本视图 我有 1 个疑问和 1 个难题 想知道是否有人可以帮助我 问题 您能否将单选组默认检查值设置为 否 单选按钮 以便一开始就不会检查任何内容 问题 如
  • Ubuntu 16.04 - Genymotion:找不到 /dev/hw_random

    I install Genymotion on the Ubuntu 16 04 64Bit I created a virtual emulator for Android 6 0 then I run this emulator but
  • 我的设备突然没有显示在“Android 设备选择器”中

    我正在使用我的三星 Galaxy3 设备来测试过去两个月的应用程序 它运行良好 但从今天早上开始 当我将设备连接到系统时 它突然没有显示在 Android 设备选择器 窗口中 我检查过 USB 调试模式仅在我的设备中处于选中状态 谁能猜出问
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • .isProviderEnabled(LocationManager.NETWORK_PROVIDER) 在 Android 中始终为 true

    我不知道为什么 但我的变量isNetowrkEnabled总是返回 true 我的设备上是否启用互联网并不重要 这是我的GPSTracker class public class GPSTracker extends Service imp
  • 在activity_main.xml中注释

    我是安卓新手 据我所知 XML 中的注释与 HTML 中的注释相同 使用 形式 我想在 Android 项目的 Activity main xml 配置文件中写一些注释 但它给了我错误 值得注意的是 我使用的是 Eclipse 但目前 我直
  • 一次显示两条Toast消息?

    我希望在一个位置显示一条 Toast 消息 并在另一位置同时显示另一条 Toast 消息 多个 Toast 消息似乎总是按顺序排队和显示 是否可以同时显示两条消息 是否有一种解决方法至少可以提供这种外观并且不涉及扰乱活动布局 Edit 看来
  • 将 Intent 包装在 LabeledIntent 中以用于显示目的

    要求 我的应用程序中有一个 共享 按钮 我需要通过 Facebook 分享 我需要选择是否安装原生 Facebook 应用程序 我们的决定是 如果未安装该应用程序 则将用户发送到 facebook com 进行分享 当前状态 我可以检测何时
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 强制 Listview 不重复使用视图(复选框)

    我做了一个定制Listview 没有覆盖getView 方法 Listview 中的每个项目都具有以下布局 联系布局 xml

随机推荐

  • 计算机网络传输层(上)

    计算机网络传输层 上 传输层概述 1 传输层协议为运行在不同host上的进程提供了一种逻辑通信机制 2 端系统运行传输层协议 发送方 将应用递交的消息分成一个或多个的segment 并向下穿给网络层 接受方 将接受到的segment组装成消
  • Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8

    问题描述 把Gradle插件版本更新到7 0 2之后编译失败 出现如下错误 A problem occurred evaluating project app gt Failed to apply plugin com android in
  • 基于vue2开发的毕业设计(时光云平台)

    自己经过一段时间的琢磨和设计 该平台已经完成了基本的功能需求 大家可以来一起看一下 或许对你的设计有所帮助 视频详解 基于vue2开发的毕业设计 时光云平台 访问连接 点击进入 前端的登录首页界面 前台注册页面展示界面 登录进去的首页界面展
  • java访问其他机器上的mysql_java实现从一台机器访问另外一台机器的mysql数据库

    烙印99 驱动程序名 String driver com mysql jdbc Driver URL指向要访问的数据库名scutcs String url jdbc mysql 另一台电脑的ip地址 3306 数据库名 MySQL配置时的用
  • Java 内部是如何判断Map中的两个键是否一样

    Java 内部是如何判断Map中的两个键是否一样 为什么会问这个问题呢 源于我在慕课网看到相关的教学视频 http www imooc com video 5987 中有出现这个判断方法 是关于重写hashcode 和equals 方法 但
  • [TFF学习]官方教程jupyter运行记录_联邦学习之图像分类任务_1

    chapter 1 检查系统环境和第三方库是否安装完毕 在Web服务器 gui应用程序和jupyter笔记本运行python程序时 出现 RuntimeError This event loop is already running 可能是
  • python“ModuleNotFoundError: No module named 模块名” 错误的一种情况

    跨目录导包 运行python脚本时 有时出现如题的错误 原因一般是用了os sys两个模块 而没有理解清楚两者的关系 os是关于本地系统的操作 sys是关于python环境的操作 如模块搜索路径配置 一种情况如下 import sys os
  • 又回老家了

    不愿意在朝阳区当天选打工人了 于是回老家了 找了份点云渲染的工作 月薪两万五 下月入职 本打算从小公司起步 做ue 没想到 现有的两套框架和十几个成熟项目不让碰 大概是提防着我吧 只让攻坚克难 做cesium for ue和热更新 想想也没
  • UE4.25 Slate源码解读

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • echarts中的legend属性

    legend orient vertical right 0 top 15 icon circle 小圆点 itemWidth 8 itemHeight 8 itemGap 15 间隔 formatter function params l
  • 潜在结果框架(Potential outcomes)与工具变量(Instrumental variable)介绍

    Potential outcomes framework 什么是potential outcome呢 考虑在医学中 X 0表示不吃药 X 1表示吃药 那么很显然 一个人是没有办法同时吃药与不吃药的 所以我们只能够观测到其中的一个结果 即 Y
  • Javaweb学生信息管理系统(Mysql+JSP+MVC+CSS)

    目录 一 项目介绍 二 运行效果 1 登录界面 2 主界面 点击学号修改学生信息 3 增加学生界面 编辑 三 项目目录结构 四 代码展示 1 jsp及css代码 登录界面代码 login jsp 登录界面css login css 注册用户
  • js深拷贝

    js深拷贝的几种方式 概念介绍 深拷贝 在堆内存中重新开辟一个存储空间 完全克隆一个一模一样的对象 浅拷贝 不在堆内存中重新开辟空间 只复制栈内存中的引用地址 本质上两个对象 数组 依然指向同一块存储空间 一 递归方式 推荐 项目中最安全最
  • 4款超实用绘图软件

    对于新手来说 很多人认为绘图软件需要一定基础的设计功底 但其实也不完全是 在网上有很多非常实用的绘图软件可以迅速的帮助我们解决工作中的绘图问题 以下4款是这两年我的小伙伴们用的最多的 推荐给大家 亿图图示 亿图图示是我用的比较多的一个绘图软
  • windows的磁盘操作之九——区分本地磁盘与移动硬盘

    转载自 windows的磁盘操作之九 区分本地磁盘与移动硬盘 bunny技术坊的技术博客 51CTO博客 原文如下 最近碰到了个新问题 记录下来作为windows的磁盘操作那个系列的续篇吧 一些时候我们的程序需要区分本地存储设备和USB存储
  • JAVA毕设可能遇到的问题,老程序员来告诉你

    在进行JAVA毕设时 有一些常见问题需要考虑和解决 以下是几个可能遇到的问题和建议的解决方案 缺乏清晰的项目目标 在开始JAVA毕设之前 需要明确项目的目标和范围 如果没有清晰的目标 可能会导致项目无法顺利进行 或者最终无法达到预期的结果
  • 正大期货交易时间

    交易所及时间 上海期货交易所 上午是9点到10点15 以及10点半到11点半 下午是13点半到14点10 以及14点20到15点 夜盘是21点到次日凌晨的2点半 大连 郑州商品交易所 上午是9点到10点15 以及10点半到11点半 下午是1
  • C++ set容器使用方法

    set是STL中一种标准关联容器 它底层使用平衡的搜索树 红黑树实现 插入删除操作时仅仅需要指针操作节点即可完成 不涉及到内存移动和拷贝 所以效率比较高 在set中 每个元素都是唯一的 如果想要允许重复元素 可以使用multiset 1 s
  • 第一次使用Android Studio时你应该知道的一切配置

    文章来源 http www cnblogs com smyhvae p 4390905 html 系列 第一次使用Android Studio时你应该知道的一切配置 第一次使用Android Studio时你应该知道的一切配置 二 新建一个
  • Adapter的getView方法详解

    BaseAdapter就Android应用程序中经常用到的基础数据适配器 它的主要用途是将一组数据传到像ListView Spinner Gallery及GridView等UI显示组件 它是继承自接口类Adapter 我们经常使用的List