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

Kotlin入门(23)适配器的进阶表达

前面在介绍列表视图和网格视图时,它们的适配器代码都存在视图持有者ViewHolder,因为Android对列表类视图提供了回收机制,如果某些列表项在屏幕上看不到了,则系统会自动回收相应的视图对象。...所以ViewHolder便应运而生,它在列表项首次初始化时,就将其视图对象保存起来,后面再次加载该视图时,即可直接从持有者处获得先前的视图对象,从而减少了系统开销,提高了系统的运行效率。...为方便理解循环适配器的Kotlin编码,下面以微信的公众号消息列表为例,给出对应的消息列表Kotlin代码: //ViewHolder在构造时初始化布局中的控件对象 class RecyclerLinearAdapter...onItemLongClick(v, position)             true         }     }     //ItemHolder中的属性在构造时初始化     inner...这下不管是在Activity代码,还是在适配器代码中,均可将控件名称拿来直接调用了。

1.8K41

Kotlin入门(22)适配器的简单优化

问题出在Kotlin要求每个变量都要初始化上面,视图持有者ViewHolder作为一个内部类,目前虽然无法直接对控件对象赋值,但是从代码逻辑可以看出先从布局文件获取控件,然后才会调用各种设置方法。...lateinit,表示该属性为延迟初始化属性; 网格视图 在前面的列表视图一小节中,给出了Kotlin改写后的适配器类,通过关键字lateinit固然避免了麻烦的空校验,可是控件对象迟早要初始化的呀...翻到前面PlanetListAdapter的实现代码,认真观察发现控件对象的获取其实依赖于布局文件的视图对象view,既然如此,不妨把该视图对象作为ViewHolder的构造参数传过去,使得视图持有者在构造之时便能一块初始化内部控件...context).inflate(R.layout.item_grid_view, null)             holder = ViewHolder(view)             //视图持有者的内部控件对象已经在构造时一并初始化了...}     //ViewHolder中的属性在构造时初始化     inner class ViewHolder(val view: View) {         val ll_item: LinearLayout

1.4K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android内存泄漏的八种可能(上)

    如果持有对象的强引用,垃圾回收器是无法在内存中回收这个对象。 在Android开发中,最容易引发的内存泄漏问题的是Context。...Activity.onDestroy()被视为Activity生命的结束,程序上来看,它应该被销毁了,或者Android系统需要回收这些内存(译者注:当内存不够时,Android会回收看不见的Activity...如果这个方法执行完,在堆栈中仍存在持有该Activity的强引用,垃圾回收器就无法把它标记成已回收的内存,而我们本来目的就是要回收它! 结果就是Activity存活在它的生命周期之外。...特殊情况:如果一个View初始化耗费大量资源,而且在一个Activity生命周期内保持不变,那可以把它变成static,加载到视图树上(View Hierachy),像这样,当Activity被销毁时,...Sensor Manager 最后,通过Context.getSystemService(int name)可以获取系统服务。这些服务工作在各自的进程中,帮助应用处理后台任务,处理硬件交互。

    54920

    fragment生命周期

    onCreate():初始化Fragment。可通过参数savedInstanceState获取之前保存的值。 onCreateView():初始化Fragment的布局。...加载布局和findViewById的操作通常在此函数内完成,但是不建议执行耗时的操作,比如读取数据库数据列表。...onActivityCreated():执行该方法时,与Fragment绑定的Activity的onCreate方法已经执行完成并返回,在该方法内可以进行与Activity交互的UI操作,所以在该方法之前...onDestroyView():销毁与Fragment有关的视图,但未与Activity解除绑定,依然可以通过onCreateView方法重新创建视图。...通常按Back键退出或者Fragment被回收时调用此方法。 onDetach():解除与Activity的绑定。在onDestroy方法之后调用。

    9510

    Android开发笔记(七十五)内存泄漏的处理

    内存泄漏的场景 在Android开发中,内存泄漏可能发生在如下几个场景: 1、查询操作后,没有关闭游标Cursor; 2、刷新适配器Adapter时,没有重用convertView对象; 3、...检查app是否发生内存泄漏,有三个办法: 1、在代码中定期检查当前进程占用的内存大小。...当列表元素多次处于“展示->隐藏->展示->隐藏……”时,就有必要重用每个元素的视图,如果不重用,那么每次展示可视元素都得重新分配视图对象(从系统服务LAYOUT_INFLATER_SERVICE获取)...重用适配可先判断convertView,如果该对象为空,则分配视图对象,并调用setTag方法保存视图持有者;如果该对象非空,则调用getTag方法获取视图持有者。...为解决该问题,在构造Handler类时就得初始化目标的弱引用,弱引用不同于前面的引用(强引用),弱引用相当于一个指针,指针指向的地址随时可以回收,这又带来一个新问题,就是弱引用指向的对象可能是空的。

    1.1K20

    Android经典面试题之RecycleView 深度解析与面试题梳理

    引言 在 Android 开发中,列表和网格布局是非常常见的界面元素,它们用于展示大量数据集合。...**ViewHolder**:缓存了视图的引用,减少对 findViewById 的调用,提高性能。 **ItemDecoration**:用于在项之间添加间隔或者自定义装饰。...工作流程 当 RecyclerView 初始化时,它会创建一个 LayoutManager,用于确定子项的布局。...用户滚动 RecyclerView 时,LayoutManager 会计算哪些项应该显示在屏幕上,并决定哪些项可以被回收复用。...在面试中,对 RecyclerView 的深入理解也是衡量一个 Android 开发者技能的重要标准。希望本文能够帮助你更好地理解 RecyclerView,并在面试中表现出色。

    17310

    Android UI布局优化之ViewStub

    一种是在类被加载的时候就完成单例对象的初始化,一种是在需要使用该单例的时候才初始化。 在android的视图设计中,同样需要使用的这样的设计模式。 这样的视图加载起来需要耗费很多的时间。...在这几百个视图里面,可能有部分视图是在点击某一按钮也就是并不是马上加载, 而是延迟到要使用的时候才加载这部分视图。也就是类似于单例模式中的懒加载。 特性: 1....ViewStub视图在首次调用setVisibility或者inflate方法之前,一直存在于视图树中 5....也就是说,在调用inflate方法之前,ViewStub一直存在于视图树中,当调用inflate之后,ViewStub被加载的视图替换,到此,ViewStub的作用完成,之后ViewStub可能被内存回收...setVisibility(GONE); // 设置当前视图不可绘制 setWillNotDraw(true); } 初始化的时候,从配置文件中取出了inflatedId和待加载的资源文件

    1.1K20

    Fragment初识

    利用片段实现此类设计时,您无需管理对视图层次结构的复杂更改。...例如:新闻应用可以使用一个片段在左侧显示文章列表,使用另一个片段在右侧显示文章—两个片段并排显示在一个 Activity 中,每个片段都具有自己的一套生命周期回调方法,并各自处理自己的用户输入事件。...这特别重要,因为模块化片段让您可以通过更改片段的组合方式来适应不同的屏幕尺寸。 在设计可同时支持平板电脑和手机的应用时,您可以在不同的布局配置中重复使用您的片段,以根据可用的屏幕空间优化用户体验。...例如:仍然以新闻应用为例—在平板电脑尺寸的设备上运行时,该应用可以在Activity A 中嵌入两个片段。...文件中静态地载入fragment,然后重写了Fragment,但是在加载Activity的时候就报错了, 大概的提示就是Fragment错误还是找不到什么的,name属性改了几次还是错!

    1.2K20

    揭开RecyclerView庐山真面目

    谷歌在Android L中新增了RecyclerView,是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式。...在开发RecyclerView时充分考虑了扩展性,因此用它可以创建想到的任何种类的的布局。但在使用上也稍微有些不便,比如使用步骤更加复杂,特别是一些控制点击、长压事件需要自己完成。...回收或重用一个View的时候,LayoutManager会向适配器请求新的数据来替换旧的数据,这种机制避免了创建过多的View和频繁的调用findViewById方法。...GridLayoutManager:在网格中展示条目,相当于之前学习的GridView。 StaggeredGridLayoutManager: 在错落的网格中展示条目,比如常见的瀑布流。...在app/main/res/layout/目录下创建recyclerview_layout.xml文件,在其中填充如下代码片段: <?

    1.8K80

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

    比如,ListView 请求的是位置 6 处的项,并向 ArrayAdapter 传入可重复使用的以前视图,ArrayAdapter 可以通过在回收过的视图里放入数据,使用回收的视图,然后再接着比如通过调用...并且知道如何将每项呈现为视图,与此同时 ListView 负责在屏幕上显示这些视图,检测用户的触摸手势,并跟踪用户是否位于整个列表中。  ...你看过 Android 中的下拉菜单吗?在 Android 中,这些叫做 Spinner,你猜怎么着?...此列表中的第一个N个视图给出from参数中第一个N列的值。...这里一定要写view.findViewById,因为findViewById是有上下文的,默认是在Activity的主布局中,我们获取的子布局是view 如果不写view.findViewById而直接写

    2.2K10

    【译】Android泄漏模式:View中的订阅

    所以我们决定在这个地方处理绑定视图的逻辑,并订阅用户名的变化。 上面的代码存在一个非常严重的bug:没有解除订阅。当尝试回收view时,Action1始终处于订阅状态。...现在整个视图层级结构都发生了泄露,无法被回收。...让我们多了解一些这个View.onAttachedToWindow(): 当view被添加到一个已经加载到window的父view中时,addView()的内部会立即调用onAttachedToWindow...当View被添加到一个还没有加载至window的父view中时,onAttachedToWindow()将会在父view被加载到window后执行。...我们在onCreated()中判断intent,如果intent的内容失效了,则立即调用finish()并返回一个代表错误信息的结果。

    54010

    已中招!Android 基础面试常常吊死在这几个问题上……

    面试官:我给你讲讲吧,你去别的公司面试你,你可以这样回答: OnCreate():这是第一次创建视图时。通常,这是我们创建视图,从包中获取数据等的地方。...这可能导致异常(类型为java.lang.IllegalArgumentException:如果使用例如findViewById在Activity中检索视图,则视图未附加到Window manager)...此机制还倾向于创建许多临时对象,并导致相当多的垃圾回收。) 15、面试官:什么是(ANR)错误,如何防止它在应用程序中发生?...ViewHolder模式:Recyclerview实现了ViewHolders模式,但在ListView 中不是必需的。RecyclerView 在滚动时回收并重用单元格。...在 ListView 中, findViewById() 在滚动 ListView 期间,代码可能会频繁调用,这可能会降低性能。即使适配器返回膨胀视图以进行回收,仍然需要查找元素并进行更新。

    2K20

    ListView详细介绍与使用

    解决方案: 为了节省内存的占用,ListView 是不会为每一条数据创建一个视图的,而是采用了 Recycler组件 的方式。回收和复用 View。 那么是如何来复用的呢?...假如当屏幕一次可以显示 x 个 item 时(不用是完整的),那么 ListView 会创建 x+1 个视图;当第1个 item 离开屏幕的时候,此时这个 item 的 View 就会被回收,再入屏的...item 的 View 就会优先从该缓存中获取。...实例演示: 假如屏幕一次只能显示 5 个 item,那么 ListView 会创建 (5+1)个 item 视图;当第 1 个 item 完全离开屏幕后才会回收至缓存,从而复用。...的长度逐一绘制 ListView 的每一行 获取数据时,通过 getItem() getItemId() 来获取 Adapter 中的数据 重点看一下 getView 实现方式一: 直接返回索引对应的数据的视图

    1.5K20

    详谈Android之MVP开发模式

    Paste_Image.png 从图中可以清晰地看出:它们有一个比较明显的区别就是,MVC中是允许Model和View进行交互的;而MVP中很明显,Model与View之间的交互由Presenter完成...,并且Presenter与View之间的交互是通过接口的,换句话说:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter来进行的,所有的交互都发生在Presenter内部。...简单分析该接口应该有哪些方法,****其实这些方法就是辅助Presenter的逻辑而存在的**** //获取用户名 密码 String getUsername(); String getPassword...initViews(); } /** * 初始化视图组件 */ public void initViews(){ username = (EditText) findViewById(...) findViewById(R.id.login_button); reset = (Button) findViewById(R.id.reset_button); loginLoading

    73240

    Fragment基本使用

    Fragment概述 1.1 介绍 Fragment是一种可以嵌入在活动中的UI片段,能够让程序更加合理和充分地利用大屏幕的空间,出现的初衷是为了适应大屏幕的平板电脑,可以将其看成一个小型Activity...,又称作Activity片段。...方式添加,在由于内存紧张导致Fragment被系统杀掉并恢复(re-instantiate)时能保留这些数据 可以在Fragment的onAttach()中通过getArguments()获得传进来的参数...(R.id.list);//获取自己视图里的控件引用,方法一 return rootView; } 在onCreateView()中,还没有创建视图,所以在这里如果使用getView()方法将返回空...listView = (ListView) getView().findViewById(R.id.list);//获取自己视图里的控件引用,方法二 ArrayAdapter arrayAdapter

    2K30

    RxBinding详解: 规范而强大的安卓UI响应式编程

    一段时间后,你的fragment或者activity中由于各种匿名类而显得十分混乱。这时,如果你想再为该类中控件/视图添加由其它视图触发的响应事件,那将变得非常复杂。...这仅仅是无数个监听事件中的两个而已。使用RxBinding时,你对这些监听事件的可以有一致的实现:RxJava的subscription。只需要对RxJava稍有了解即可。...EditText的原始文本类型是CharSequence,而你要获取倒序的String类型的文本,你可以这样: final TextView nameLabel = (TextView) findViewById...在 context 中使用 share 允许对同一个button点击事件的多次监听,简直太强大了。 RxBinding 癖好与安装 在使用RxBinding时需要注意一些地方。...在RxBinding中,这些参数被封装成一个ViewScrollChangeEvent 。

    2.9K40
    领券