接下来是 RecyclerView 的重头戏了,也就是 ViewHolder 和 Adapter 类。...Adapter 类从数据源获得数据,并且将数据传递给正在更新其所持视图的 ViewHolder。下图显示了 RecyclerView、Adapter、ViewHolder 和数据之间的协作关系。...() { } 重写 RecyclerView.Adapter 的类需要重写三个方法 onCreateViewHolder()、onBindViewHolder...() onBindViewHolder() 被调用的时候,会传入参数 ViewHolder 和一个位置 (position),它表示在 flowerList 中所绑定的表项的位置。...该位置可以用于提取表项所需的数据,并且将数据传递给 ViewHolder 来使数据绑定到对应的 UI。
() { //首先自定义一个类继承RecyclerView.ViewHolder 实现构造函数 class ViewHolerextends RecyclerView.ViewHolder...可以对TextView进行赋值, - 在外界进行配置 @Override public void onBindViewHolder(RecyclerView.ViewHolder...用数组 承载 展示数据 @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, intposition) { ViewHoler...,资源就是建立的cell * 第二项:是我们创建的布局的根对象,这里传 null ,通过这种方式我们就创建了这种布局。...创建构造函数 public void onBindViewHolder(RecyclerView.ViewHolder holder, intposition) { ViewHoler vh
Item: Recyclerview DSL中,用来保存View对应数据的类,比如说TextView的字符串,Imageview的url等等,基本上可以认为是担任着ViewModel的角色 ItemController...传View到OnBindViewHolder中。...,用来从OnCreateViewHolder传View到OnBindViewHolder中。...于是你觉得,OnBindViewHolder的逻辑可以写在ViewHolder里面,然后 class CourseViewHolder(itemView: View) : RecyclerView.ViewHolder...于是我开始思考在Recyclerview的架构中,确定一类视图到底需要什么?哪些东西可以用一个最小的集合来定义一类视图?
我们这样思考,当我们去完成一个界面的布局时,我们要向里面传数据,怎么去传呢?全写在xml文件里显而不合适,这就是Adapter的作用。...而设置布局管理器RecyclerView则是来控制Item的布局方式,横向、竖向以及瀑布流方式 例如:你想控制横向或者纵向滑动列表效果可以通过LinearLayoutManager这个类来进行控制(与...创建适配器实现步骤如下: ① 创建Adapter:创建一个继承RecyclerView.Adapter的Adapter类 ② 创建ViewHolder:在Adapter中创建一个继承RecyclerView.ViewHolder...该方法把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,当然这个ViewHolder就是前面的那个静态内部类的实例 2. onBindViewHolder()...在这里,补充一个知识点,关于RecyclerView的调用顺序总是按照: 获取大小——>绑定布局——>加载ViewHolder类——>绑定数据 这样一个规律的,通过这样的规律,我们就能知道是按照怎样的顺序来调用这些重载函数的了
} //通过方法提供的ViewHolder,将数据绑定到ViewHolder中 @Override public void onBindViewHolder(MyHolder...该类继承于RecyclerView.Adapter,其中VH是我们adapter类中创建的一个继承于RecyclerView.ViewHolder的静态内部类。...onBindViewHolder: 通过方法提供的ViewHolder,将数据绑定到ViewHolder中。getItemCount: 获取数据源总的条数。...MyHolder : 这是RecyclerView.ViewHolder的实现类,用于初始化item布局中的子控件。需要注意的是,在这个类的构造方法中需要传递item布局的View给父类 。...我们可以在RecyclerView的Adapter中自定义一个接口,并创建一个供其他类设置监听的方法。
动画,指定Item之间的分隔线 RecyclerView相关的重要类 Adapter ViewHolder LayoutManager ItemDecoration ItemAnimator 添加RecyclerView...采用layout_margin的方式 * * 主要是动态设置View的高度 adapter类中的 onBindViewHolder */ public class StaggeredGridLayuoutAct...); } 为RecyclerView添加item的点击事件 方法一:利用回调的方式实现(不太完善,仍可实现) 实现步骤如下: 在adapter类中,定义接口,接口中定义两个方法分别对应click...()中的v.getTag()方法,这需要在onBindViewHolder()方法中设置和item相关的数据 @Override public void onBindViewHolder(ViewHolder...view的setOnClickListener本来就是观察者模式,我们将这个观察者模式的事件监听传递给了我们自己的观察者模式。
这个类里面有三个抽象方法需要我们去重写,分别是: onCreateViewHolder(ViewGroup parent, int viewType) onBindViewHolder(@NonNull...是一个静态内部类,继承自 RecyclerView.ViewHolder 类。...类将子项布局中所有控件绑定为一个对象,该对象包含子项布局的所有控件 static class ViewHolder extends RecyclerView.ViewHolder {...//父类构造函数 super(view); //获取RecyclerView布局的子项布局中的所有控件id,本次实验只有TextView这一种控件..., int i) { //获取当前位置的子项对象 String str = stringList.get(i); //从当前子项对象中获取数据,绑定在viewHolder
我们可以看到,这个RecyclerView中有多种item显示出来,那么具体怎么实现呢,其实在RecyclerView中,我们可以重写方法getItemViewType(),这个方法会传进一个参数position...步骤: 1:item的布局文件(xml) 2:item的bean类(第二个方法写一个) 3:自定义ViewHolder类继承RecyclerView.ViewHolder 4:自定义adapter继承... c:onBindViewHolder绑定数据 5:主文件中设置recyclerview的布局样式,赋值调试 1:Item xml布局文件和Bean类,ViewHolder创建。...(View view);这个方法是自定义的需要继承RecyclerView.ViewHolder public class TypeViewHolderOne extends RecyclerView.ViewHolder...*/ @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { //优化
可展开的Adapter支持的功能如下: 支持两行可展开能力(单一类型适配) 支持空状态; 支持Header、Footer的适配 LoadMore的适配 使用类:BaseExpandableRecyclerViewAdapter...(RecyclerView.ViewHolder holder) { } }); (5)点击的监听 adapter.setListener...基本原理 基本继承RecyclerView.Adapter复写的类中封装了一些常用到的写法,抽象出来 (1)在getItemViewType中分别对ViewType做区分:VIEW_TYPE_EMPTY...其中将Group和Child也当作为一种类型进行区分,根据position、及group和child的数量可以计算出折叠或者展开之后的位置。...@Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull
或者GONE 都可以,推荐使用INVISIBLE它会占用布局位置但是不显示,这样可以避免布局中其他控件因为勾选布局的消失而轻微变动位置 2.将适配器类中的onCreateViewHolder方法重写添加按键监听...,onBindViewHolder方法中重写添加判断点击的位置(具体原理请查看下面贴的代码) PS: RecyclerView的实现全部方法就不贴出来了,本人的博客中有RecyclerView各种实现效果文章...1.首先在一行的xml布局中添加一个选中效果的icon图片,未选中的情况下INVISIBLE或者GONE 都可以,推荐使用INVISIBLE它会占用布局位置但是不显示,这样可以避免布局中其他控件因为勾选布局的消失而轻微变动位置...2.将适配器类中的onCreateViewHolder方法重写添加按键监听,onBindViewHolder方法中重写添加判断点击的位置(具体原理请查看下面贴的代码) package com.example.lenovo.mydemoapp.myDeviceList...class ViewHolder extends RecyclerView.ViewHolder { ImageView mListImage,mListSelect; TextView mListNameText
holder = new ViewHolder(view); return holder; } @Override public void onBindViewHolder...list.remove(position); notifyItemRemoved(position); } } 第二点:LayoutManager 这个LayoutManager类决定视图被放在画面中哪个位置...LayoutManager只有一个叫做LinearLayoutManager的实现类,我们可以设置它的横向和纵向。...它不关心如何将子View放在合适的位置,也不关心如何分割这些子View,更不关心每个子View各自的外观。更进一步来说就是RecyclerView它只负责回收和重用的工作,这也是它名字的由来。...所有关于布局、绘制和其他相关的问题,也就是跟数据展示相关的所有问题,都被委派给了一些”插件化”的类来处理。这使得RecyclerView的API变得非常灵活。你需要一个新的布局么?
设置不同的布局样式流程 : ① 自定义 RecyclerView.Adapter 泛型类型 : 适配器的泛型类型需要设置为 RecyclerView.ViewHolder , 这是所有 ViewHolder...的基类 ; public class Adapter extends RecyclerView.Adapter ② 实现 getItemViewType...( ) 方法 : 这里为不同位置的组件设置不同的布局类型 ; @Override public int getItemViewType(int position) {...Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position)...适配器 * RecyclerView.Adapter 中的 ViewHolder 泛型设置为 RecyclerView.ViewHolder * 同理 onBindViewHolder
前面在介绍列表视图和网格视图时,它们的适配器代码都存在视图持有者ViewHolder,因为Android对列表类视图提供了回收机制,如果某些列表项在屏幕上看不到了,则系统会自动回收相应的视图对象。...、长按监听器itemLongClickListener等等,故而完全可以把这些通用部分提取到一个基类,然后具体业务再从该基类派生出特定的业务适配器类。... //绑定视图持有者中的各个控件对象,需要子类重写 override abstract fun onBindViewHolder(holder: RecyclerView.ViewHolder...、onCreateViewHolder、onBindViewHolder三个方法,以及视图持有者的类定义 class RecyclerGridAdapter(context: Context, private...,作为外部传进来的变量。
在RecyclerView中搜索getUnmodifiedPayloads函数,发现其中一处应该跟我们的问题有关 boolean canReuseUpdatedViewHolder(RecyclerView.ViewHolder...viewHolder, viewHolder.getUnmodifiedPayloads()); } payloads应该对这个函数的返回值有影响,继续看mItemAnimator的对应函数。...这个mItemAnimator也是一个接口,实现类是DefaultItemAnimator,它的对应函数 public boolean canReuseUpdatedViewHolder(@NonNull...先看看它们俩个有什么用 mChangedScrap 与RecyclerView分离的ViewHolder列表 mAttachedScrap 未与RecyclerView分离的ViewHolder列表...而在滑动中不仅位置一直变,因为进度也在变,所以不停的进行移除bind,就会导致重影的现象。 而使用了payload后,不会移除重新bind,只更新进度条自己,就不会闪烁或重影了。
new MyViewHolder(view); } @Override public void onBindViewHolder(RecyclerView.ViewHolder...flag = new boolean[100];//此处添加一个boolean类型的数组 @Override public RecyclerView.ViewHolder onCreateViewHolder...,然后设置CheckBox的选中监听器,把null作为参数传进去,然后用数组中的值设置对应CheckBox的选中状态,最后再一次设置CheckBox的选中监听器,把CheckBox的选中状态储存在数组中的相应位置中...layout_marginRight="10dp" android:text="delete"/ </RelativeLayout 我们增加了一个Button,接下来设置这个Button,当它被点击的时候就删除它所在位置的...range大小范围内的view进行重新onBindViewHolder } }); 只要加一行代码就好了,这行代码的作用就是对于被删掉的位置及其后range大小范围内的view进行重新onBindViewHolder
点击事件的注册是在 RecyclerView 的 onBindViewHolder 中: public void onBindViewHolder(BuyCarPlanItemViewHolder holder...大概意思就是: RecyclerView 中的数据有位置改变(比如删除)时一般不会重新调用 onBindViewHolder() 方法,除非这个元素不可用。...也就是说 onBindViewHolder() 方法中的位置参数 position 不是实时更新的,所以在我们删除元素后,item 的 position 没有改变。...为了实时获取元素的位置,RecyclerView 为我们提供了 ViewHolder.getAdapterPosition() 方法。...ViewHolder 和 RecyclerView 的关系我们知道,就是存储、复用指定位置对于的 ItemView。
标准用法 RecyclerView的标准实现步骤如下: 创建Adapter:创建一个继承RecyclerView.Adapter的Adapter类(VH是ViewHolder的类名),记为NormalAdapter...类,T是列表数据中每个元素的类型,QuickAdapter.VH是QuickAdapter的ViewHolder实现类,称为万能ViewHolder。...是在创建Adapter时将实现OnStartDragListener接口的Activity对象作为参数传进来。...Recycler是RecyclerView回收机制的实现类,他实现了四级缓存: mAttachedScrap: 缓存在屏幕上的ViewHolder。...RecyclerView局部刷新的实现原理也是基于RecyclerView的回收机制,即能直接复用的ViewHolder就不调用onBindViewHolder()。
我们都知道,对与RecyclerView的使用,是创建一个adapter类,然后在adapter类中再创建一个ViewHolder的内部类。...可以看到,BaseRecyclerAdapter继承自RecyclerView.Adapter<BaseViewHolder ,此时我们只需要实现onBindViewHolder 这个方法即可。...其中,adapter类继承BaseRecyclerAdapter,viewHolder类继承BaseViewHolder。...其中参数tagPosition便是对应的itemVIew处于RecyclerView中的位置。...在这里是为两个button添加点击事件,先为其设置tag,再设置点击事件,我们这里的setOnClickListener(this) ;参数传的是this,是因为,我们再父类中实现了View的onClick
都是复用的,因为没有 create viewHolder 的日志,然后只有后面3个卡位重新绑定数据,调用了onBindViewHolder();那么问题来了: Q2: 在这个过程中,为什么当 RecyclerView...第6步 这个就是常说扩展类了,RecyclerView 提供给我们自定义实现的扩展类,我们可以重写 getViewForPositionAndType() 方法来实现自己的复用策略。...来使用了,这也就是为什么从这里拿的 ViewHolder 都需要重新 onBindViewHolder() 了。...,回收时,最新的 ViewHolder 都是往 mCachedViews 里放,如果它满了,那就移出一个扔到 ViewPool 里好空出位置来缓存最新的 ViewHolder。...答:有时一行只有3个卡位需要重新绑定的原因跟Q2一样,因为 mCachedView 里正好缓存着当前位置的 ViewHolder,本来就是它的 ViewHolder 当然可以直接拿来用。
(注意这里的泛型直接传的是RcyclerView.ViewHolder接口,因为我们的item布局有多个,所以要准备多个Viewholder) 编写...这里也把另一个ViewHolder贴上先: class PoemListViewSelfHolder extends RecyclerView.ViewHolder { private ItemPoemListSelfBinding...,重写onBindViewHolder(RecyclerView.ViewHolder holder,int position)方法 这一步来绑定数据,并且解决databinding在recyclerview...中常见的闪烁问题: @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, final...ViewHolder了,如果只是单纯的绑定数据和显示数据,其实还有一种简单的写法: @Override public void onBindViewHolder(BindingHolder
领取专属 10元无门槛券
手把手带您无忧上云