前言 这两天在做一个新的APP,在考虑用户体验上要一个两级的列表嵌套,于就想看看RecyclerView是否能做出这样的效果,自己写了一个DEMO来做一下测试,最后的效果还是比较满意的。...下面我就说一下RecyclerView嵌套RecyclerView的实现。...ItemAdapter的类 public class ItemAdapter extends RecyclerView.AdapterRecyclerView.ViewHolder> { private...mainAdapter类 我们再来创建mainAdapter的类 public class mainAdapter extends RecyclerView.AdapterRecyclerView.ViewHolder...然后我们通过创建GridLayoutManager把子的RecyclerView改为Grid为两排的布局。 ?
.widget.RecyclerView$ViewHolder.mItemViewType' on a null object reference at android.support.v7.widget.RecyclerView...(RecyclerView.java:5057) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java...:3315) at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3124) at android.support.v7....widget.RecyclerView.onLayout(RecyclerView.java:3568) at android.view.View.layout(View.java:15596)...,竟然犯了一个低级错误,我擦,由于我的recyclerview总共有6种类型,而我现在只写了一种类型测试,其他的都没有些,才导致报空,即在getItemCount中return 1;就ok了,汗(⊙﹏
前言 在移动应用开发中,列表组件是一个非常常见的 UI 组件,绝大多数应用开发中都会使用到列表组件进行界面的开发,在 Android 开发中列表组件一般使用官方提供的 RecyclerView ,而...RecyclerView 的常规开发需要手动创建对应的 Adapter、ViewHolder 代码,且每个 RecyclerView 的使用都需要编写这种的样板代码,存在重复代码,降低了开发效率,于是为了提高列表的开发效率...• 变量名必须为 item,因为这是框架里封装好的,名称不对无法自动接收传递过来的数据 • item 的数据类型需跟前面 ViewModel 中定义的列表中的数据类型一致,也就是与上面定义的 data...传入的参数 binding 即为 BINDING 类型,然后通过 binding.root获取布局的实际 View 将其传给 RecyclerView.ViewHolder。...这里的 BR.item和 BR.handler是 DataBinding 根据布局里使用的变量自动生成的,所以为了生成这两个变量,建了一个空的布局文件,定义了这两个变量,如下: <?
); } /** * 对应Item中的控件 */ public static class ViewHolder extends RecyclerView.ViewHolder...holder, int position) { // 获取当前Item中的显示的数据 SampleModel sampleModel = datas.get(position...); } /** * 对应Item中的控件 */ public static class ViewHolder extends RecyclerView.ViewHolder...而“为RecyclerView的每个子item设置setOnClickListener”在Adapter中设置。其实直接在onClick中也能完全处理item的点击事件,但是这样会破坏代码的逻辑。...(datas[position]); //将数据保存在itemView的Tag中,以便点击时进行获取 viewHolder.itemView.setTag(datas[position
Android RecyclerView 是Android5.0推出来的,导入support-v7包即可使用。 个人体验来说,RecyclerView绝对是一款功能强大的控件。...------------------------ 那么让我们通过一些Demo来了解RecyclerView的基本使用 android studio build.gradle文件中 dependencies...中添加 compile 'com.android.support:recyclerview-v7:22.+' 首先,要导入support-v7 包 import android.support.v7....itemView) { super(itemView); // 通常ViewHolder的构造,就是用于获取控件视图的 imageView...(View itemView) { 127 super(itemView); 128 // 通常ViewHolder的构造,就是用于获取控件视图的 129
基本概念 RecyclerView是Android 5.0提出的新UI控件,位于support-v7包中,可以通过在build.gradle中添加compile 'com.android.support...中获取合适的View,在后文的回收机制中会介绍该方法的具体实现。...runPendingAnimations(): RecyclerView动画的执行方式并不是立即执行,而是每帧执行一次,比如两帧之间添加了多个Item,则会将这些将要执行的动画Pending住,保存在成员变量中...或mCachedViews中获取的ViewHolder,则不会调用onBindViewHolder(),mAttachedScrap和mCachedViews也就是我们所说的Scrap Heap;而如果从...mViewCacheExtension或mRecyclerPool中获取的ViewHolder,则会调用onBindViewHolder()。
---- 在 Module 中的 build.gradle 的 dependencies 中配置 RecyclerView 的依赖库 ; dependencies { implementation...设置流程 RecyclerView 设置流程 : ① 初始化 RecyclerView 对象 : 一般是从布局文件中获取 ; ② 创建并设置布局管理器 : 可以使用预置的布局管理器 , 也可以自定义布局管理器...; ③ 设置适配器 : 一般是使用自定义的适配器 , 设置给 RecyclerView 对象 ; //1 ....从布局中获取 RecyclerView RecyclerView recycler_view = findViewById(R.id.recycler_view); //2 ....从布局中获取 RecyclerView RecyclerView recycler_view = findViewById(R.id.recycler_view);
比较发生了相当大的变化,主要有3个方法: getItemCount 这个不用说,获取总的条目数 onCreateViewHolder 创建ViewHolder onBindViewHolder...其实是这样的,我们创建的ViewHolder必须继承RecyclerView.ViewHolder,这个RecyclerView.ViewHolder的构造时必须传入一个View,这个View相当于我们...ListView getView中的convertView (即:我们需要inflate的item布局需要传入)。...还有一点,ListView中convertView是复用的,在RecyclerView中,是把ViewHolder作为缓存的单位了,然后convertView作为ViewHolder的成员变量保持在ViewHolder...中,也就是说,假设没有屏幕显示10个条目,则会创建10个ViewHolder缓存起来,每次复用的是ViewHolder,所以他把getView这个方法变为了onCreateViewHolder。
onCreateViewHolder(ViewGroup parent, int viewType) 方法 用于加载 RecyclerView 子项的布局,然后返回一个 ViewHolder 对象,ViewHolder...TextAdapter(stringList); //为recyclerView设置适配器,即将适配器中数据传入recyclerView中 recyclerView.setAdapter...类将子项布局中所有控件绑定为一个对象,该对象包含子项布局的所有控件 static class ViewHolder extends RecyclerView.ViewHolder {...//父类构造函数 super(view); //获取RecyclerView布局的子项布局中的所有控件id,本次实验只有TextView这一种控件..., int i) { //获取当前位置的子项对象 String str = stringList.get(i); //从当前子项对象中获取数据,绑定在viewHolder
ViewHolder,注意到这里我们有一个静态内部类ViewHolder ,继承自RecyclerView.ViewHolder,重写里面的ViewHolder构造方法,获取一个Item的视图View,...下面是获取item布局中的控件,修改一下内部类ViewHolder中的代码,如下所示: public static class ViewHolder extends RecyclerView.ViewHolder...,在onCreate()执行时会调用initView(),initView()方法中,采用findViewById获取toolbar和RecyclerView的实例,然后设置返回事件,之后就是new StringAdapter...我增加了一个show变量,用来控制适配器Item的选中框是否显示,提供了show变量的get和set方法,在set方法中赋值之后调用notifyDataSetChanged()方法对适配器进行刷新,这个方法会触发...最后通过获取的helper实例,然后关联RecyclerView。
设置不同的布局样式流程 : ① 自定义 RecyclerView.Adapter 泛型类型 : 适配器的泛型类型需要设置为 RecyclerView.ViewHolder , 这是所有 ViewHolder..., 可以调用 getItemViewType 方法 , 获取当前的布局类型 , 然后根据该布局类型 , 将 ViewHolder 参数强转为不同的子类对象 , 然后为其绑定数据 ; @...从布局中获取 RecyclerView RecyclerView recycler_view = findViewById(R.id.recycler_view); /...适配器 * RecyclerView.Adapter 中的 ViewHolder 泛型设置为 RecyclerView.ViewHolder * 同理 onBindViewHolder...中的泛型也要是该类型的 */ public class Adapter extends RecyclerView.AdapterRecyclerView.ViewHolder> {
基本概念 RecyclerView是Android 5.0提出的新UI控件,位于support-v7包中,可以通过在build.gradle中添加compile 'com.android.support...runPendingAnimations(): RecyclerView动画的执行方式并不是立即执行,而是每帧执行一次,比如两帧之间添加了多个Item,则会将这些将要执行的动画Pending住,保存在成员变量中...其中,getActiveView()是从mActiveViews中获取合适的View,如果获取到了,则直接返回,而不调用obtainView(),这也印证了如果从mActiveViews获取到了可复用的...或mCachedViews中获取的ViewHolder,则不会调用onBindViewHolder(),mAttachedScrap和mCachedViews也就是我们所说的Scrap Heap;而如果从...mViewCacheExtension或mRecyclerPool中获取的ViewHolder,则会调用onBindViewHolder()。
这样当下次再获取相同控件实例的话,就可以直接从HashMap缓存中获取了。 这就是kotlin-android-extensions插件的实现原理,其实还是非常简单的。...参数,在Activity中是可以直接获取到的。...接下来不一样的地方在于,由于我们是在onCreateView()函数中加载的布局,那么理应在与其对应的onDestroyView()函数中对binding变量置空,从而保证binding变量的有效生命周期是在...而RecyclerView把ListView中的这个普遍应用的最佳实践直接作为默认实现集成了进去,所以只要我们使用RecyclerView,就一定要写ViewHolder。...但是注意,ViewHolder的父类RecyclerView.ViewHolder它只会接收View类型的参数,因此我们需要调用binding.root获得fruit_item.xml中根元素的实例传给
一:RecycleView RecyclerView 英 [ri:'saɪklə] 是 Android 开发中的一个重要组件,通常直译为 “recycler 视图” 或循环视图 1:目标需求...的位置 返回值:无 触发时机:当 ViewHolder 需要展示数据时调用 4:getItemCount 作用:返回 RecyclerView 中的 item 总数 参数:无 返回值:int...滑动过程中:如果后续滑动时,新的列表项进入屏幕,而之前回收的 ViewHolder 不足以复用(比如快速滑动导致临时需求增加),可能会额外多创建几个 ViewHolder作为 “缓冲”(比如 12 个)...6:onCreateViewHolder() 的调用时机和次数 滑动过程中:每次有新的列表项进入屏幕(无论是向上滑还是向下滑),都会触发 onBindViewHolder(),为复用的 ViewHolder...7:在Adapter中怎么找到布局 我们在RecyclerView.Adapter中获取不到LayoutInflater(布局加载器),但是没有关系;这种可以借鉴这种思想 @NonNull @Override
事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup ) 【Android 事件分发...从布局中获取 RecyclerView recycler_view = findViewById(R.id.recycler_view); //2 ...., 才可以应用具体方向的拖动 * @param recyclerView * @param viewHolder * @return */ @Override...从布局中获取 RecyclerView recycler_view = findViewById(R.id.recycler_view); //2 ....* 只有在此处打开了指定方向的设置 , 才可以应用具体方向的拖动 * @param recyclerView * @param viewHolder * @return
基本概念 RecyclerView是Android 5.0提出的新UI控件,位于support-v7包中,可以通过在build.gradle中添加compile 'com.android.support...创建ViewHolder:在NormalAdapter中创建一个继承RecyclerView.ViewHolder的静态内部类,记为VH。...runPendingAnimations(): RecyclerView动画的执行方式并不是立即执行,而是每帧执行一次,比如两帧之间添加了多个Item,则会将这些将要执行的动画Pending住,保存在成员变量中...或mCachedViews中获取的ViewHolder,则不会调用onBindViewHolder(),mAttachedScrap和mCachedViews也就是我们所说的Scrap Heap;而如果从...mViewCacheExtension或mRecyclerPool中获取的ViewHolder,则会调用onBindViewHolder()。
前面在介绍列表视图和网格视图时,它们的适配器代码都存在视图持有者ViewHolder,因为Android对列表类视图提供了回收机制,如果某些列表项在屏幕上看不到了,则系统会自动回收相应的视图对象。...为方便理解循环适配器的Kotlin编码,下面以微信的公众号消息列表为例,给出对应的消息列表Kotlin代码: //ViewHolder在构造时初始化布局中的控件对象 class RecyclerLinearAdapter... //绑定视图持有者中的各个控件对象,需要子类重写 override abstract fun onBindViewHolder(holder: RecyclerView.ViewHolder...其中的缘由是Anko库仅仅实现了Activity活动页面的控件自动获取,并未实现适配器内部的自动获取。...,作为外部传进来的变量。
ViewHolder 负责存储 RecyclerView 中每一个单独的表项所需要显示的信息。...RecyclerView 仅需要创建当前所显示的表项数量的 ViewHolder 外加缓存中的几个 ViewHolder 即可。...在 ViewHolder 中,创建一个变量来引用 TextView,然后将它指向表项布局里对应的视图。...重写 onCreateViewHolder() 当 ViewHolder 创建的时候会调用该方法。在该方法里进行初始化和填充 RecyclerView 中的表项视图。...定义一个变量叫做 recyclerView,然后将 activity_main 中的 RecyclerView 赋值给 recyclerView。
微件之后,需要获取对象句柄,将其连接到布局管理器,并为要显示的数据附加适配器 创建适配器实现步骤如下: ① 创建Adapter:创建一个继承RecyclerView.Adapter的Adapter类...② 创建ViewHolder:在Adapter中创建一个继承RecyclerView.ViewHolder的静态内部类。...该方法把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,当然这个ViewHolder就是前面的那个静态内部类的实例 2. onBindViewHolder()...在这里,补充一个知识点,关于RecyclerView的调用顺序总是按照: 获取大小——>绑定布局——>加载ViewHolder类——>绑定数据 这样一个规律的,通过这样的规律,我们就能知道是按照怎样的顺序来调用这些重载函数的了...(linearLayoutManager); 2.使用RecycleView时适配器要继承 RecyclerView.AdapterRecyclerView.ViewHolder>,adapter中必须实现
的依赖,因为RecyclerView不是内置在android系统中的,请注意版本要一致 dependencies { implementation fileTree(dir: 'libs', include...compile 'com.android.support:recyclerview-v7:27.1.1' } 2.在布局中添加RecyclerView组件 中没有item的监听事件,需要自己在适配器中写一个监听事件的接口。...position); // holder.mItemGoodsImg; holder.mItemGoodsName.setText(data.goodsName);//获取实体类中的...name字段并设置 holder.mItemGoodsPrice.setText(data.goodsPrice);//获取实体类中的price字段并设置 } /**