皮皮网
皮皮网

【火影ol源码】【raknet 源码】【joytokey 源码】recyclerview关联源码_recyclerview源码分析

来源:magicodes.weichat 源码 发表时间:2024-11-29 23:41:05

1.Android-RecyclerView原理
2.ItemTouchHelper实现RecyclerView拖拽&合并的关联效果
3.Android自定义控件之像ListView一样使用RecyclerView - 自定义控件属性
4.使用recyclerview要导入什么包
5.Android RecyclerView使用简述
6.Android--RecyclerView嵌套RecyclerView优化

recyclerview关联源码_recyclerview源码分析

Android-RecyclerView原理

       ListView的基本实现与优化

       ListView是Android中实现列表最简单的方法,通过Adapter可以将数据转换为视图。源码源码为了优化性能,分析可以充分利用ListView的关联缓存机制。ListView内部有两层缓存,源码源码第一层是分析火影ol源码一级缓存,主要缓存当前屏幕内的关联View。第二层是源码源码二级缓存,当一级缓存中找不到时,分析会从缓存池中查找可复用的关联ItemView。当滑动到特定位置,源码源码ListView会将当前position位置的分析ItemView作为参数传给getView,此时可以复用ItemView,关联仅需更新数据,源码源码而不需重新创建View。分析

       RecyclerView的特性与优势

       尽管ListView已有两层缓存机制,但Android开发团队依然开发了RecyclerView。RecyclerView提供了更高效的性能优化,如避免在一次数据更新时执行两次layout,这将减少多次调用getView的情况。此外,RecyclerView在创建视图和数据绑定上提供了更简洁的API,如onCreateViewHolder和onBindViewHolder,使用缓存时只需调用onBindViewHolder来更新数据,raknet 源码无需执行onCreateViewHolder。这使得数据渲染过程与视图创建过程分离,提高了代码的复用性和性能。

       性能与动画

       RecyclerView在性能和动画效果方面具有明显优势。其动画效果API使ItemView的动画变得简单,而ListView则需要在每个ItemView中单独设置。在动画处理方面,RecyclerView也更为高效。另外,RecyclerView支持局部刷新,而非ListView的全局刷新。这在性能上更为优越,尤其是在处理如Feed流这样的大量数据时,局部刷新能显著减少性能开销。

       自定义缓存与数据同步

       在数据同步和自定义缓存方面,RecyclerView提供了更多灵活性。它拥有四级缓存机制,使用者可以根据不同的场景进行缓存优化,从而达到更好的性能效果。此外,通过自定义缓存扩展(ViewCacheExtension),开发人员可以针对特定需求实现更个性化的缓存策略。

       RecyclerView的joytokey 源码简单使用与源码解析

       使用RecyclerView时,首先在布局中添加一个RecyclerView,然后定义每个Item的数据类和Adapter。设置RecyclerView的布局管理器和Adapter。当需要局部刷新时,只需调用RecyclerView的局部刷新API,其他位置的ViewHolder不会执行onCreateViewHolder和onBindViewHolder。

       从Adapter到RecyclerView的刷新逻辑

       当调用Adapter的notify系列方法时,RecyclerView会自动触发刷新。这源于AdapterDataObservable对象的使用,它是Adapter中的可观察对象,监听数据变更并触发监听回调。在Adapter的registerAdapterDataObserver方法中,RecyclerView会将其注册为观察者,确保在数据变更时能够自动刷新UI。

       刷新过程解析

       当数据变更时,RecyclerView内部会调用mObserver对象的onXXXChanged系列方法。这些方法通常会调用requestLayout来主动触发布局刷新。在requestLayout过程中,会调用View的onMeasure和onLayout方法,从而触发布局更新。通过深入分析RecyclerView源码,可以了解到整个刷新过程中的缓存机制、ViewHolder的lightapp 源码复用和数据绑定流程,以及如何实现动画效果和局部刷新。

       在解析RecyclerView源码时,重点关注AdapterDataObservable、mObserver、mLayout以及其子类(如LinearLayoutManager)的实现细节。通过理解这些核心组件的工作原理,可以更好地掌握RecyclerView的高级特性和优化技巧。

ItemTouchHelper实现RecyclerView拖拽&合并的效果

       左侧栏展示的是一个RecyclerView,通过手势拖拽可以实现排序功能,还能将图标合并为文件夹,类似于桌面应用图标合并的交互体验。

       实现此功能的核心是利用ItemTouchHelper.Callback。它能够快速处理拖拽排序和滑动移除效果,但为了达到合并效果,需要对此进行改造。

       核心思路在于:

       1. 重写chooseDropTarget()方法,当两个viewHolder重叠部分满足合并条件时,暂存这两个viewHolder。不满足则清空暂存变量。

       2. 在拖拽结束时,即手抬起时,若暂存变量非空,则触发合并逻辑。cvwarpperspective 源码

       深入源码:

       理解ItemTouchHelper的实现原理,是改造的基础。拖动viewHolder时,触摸事件由mOnItemTouchListener#onTouchEvent()分发,处理MotionEvent.ACTION_MOVE事件后,通过moveIfNecessary(ViewHolder viewHolder)实现位置交换。

       具体实现:

       1. 重写chooseDropTarget(),在重叠状态时暂存viewHolder,并确保在重叠情况下返回null,以阻止默认行为。

       2. 重写onSelectedChanged(),在拖动结束时判断是否需要触发合并操作。

       接口封装:

       为了更好地实现功能,封装了三个接口:IDragAdapter、IDragItem、IDragHandler,分别对应适配器、列表拖拽项和拖拽处理,便于根据场景实现特定功能。

       具体实现:

       1. IDragItem接口描述列表拖拽项接口,由RecyclerView的具体ViewHolder实现,用于判断是否可以拖动、合并和显示拖拽状态。

       2. IDragAdapter接口描述适配器接口,由RecyclerView的具体Adapter实现。

       3. IDragHandler接口描述拖拽处理接口,用于拖拽条件判断、回调监听、合并处理逻辑。接入拖拽功能时,需实现此接口,并通过DragTouchCallback#setDragHandler()赋值。

       使用方法:

       实现IDragHandler#onMergeData()接口方法,绑定RecyclerView使用DragTouchCallback。在完成IDragHandler注册并绑定recyclerView后,即可实现拖拽、合并效果。

       总结:

       文章提供了一个从原理理解到具体实现的完整流程,包括源码分析、接口设计和使用指南。git项目中有相关Demo演示,感兴趣的开发者可以参考学习。

       项目地址:[GitHub链接]。感谢阅读至此,演示效果包括合并文件夹和合并相加。

Android自定义控件之像ListView一样使用RecyclerView - 自定义控件属性

       通过分析,我们了解到ListView在XML文件中通过定义属性实现诸如分隔条、分隔条高度以及使用string数组作为数据源等特性。在strings.xml文件中定义string数组,然后引用其name作为android:entries属性值,实现数据源设置。

       为了深入理解ListView的源码处理,我们在项目列表中切换到Project视图,查看所有依赖的库和编译平台。在res\values\attrs.xml文件中,系统定义了所有控件的自定义属性,通过搜索"ListView"找到相关的定义。其中,entries属性引用了已有的定义以解决同名属性冲突问题。

       进一步,我们查看了ListView的源码,特别是其构造方法。在处理entries属性时,通过TypedArray对象获取自定义属性,使用getTextArray方法获取字符串数组。若未定义,则返回null。之后,创建ArrayAdapter对象将数组作为数据源设置给Adapter,并绑定至R.layout.simple_list_item_1布局中的TextView,最后调用setAdapter方法。

       ArrayAdapter是用于将数据列表绑定至item布局中的TextView,系统提供了此类以方便开发者使用ListView适配器。除了ArrayAdapter,还有SimpleAdapter和CursorAdapter等。

       divider属性通过getDrawable方法获取Drawable对象,然后调用setDivider方法设置分隔线。

       为了使RecyclerView具备类似功能,我们直接复制并粘贴ListView的自定义属性声明至attrs.xml中。然而,在进行编译时,发现与系统控件同名属性冲突。为解决此问题,我们为自定义属性前加上前缀"android:"并去除"format",再次编译时错误消除。

       然而,这种解决方案导致在使用自定义属性时,Android Studio无法提供提示。为兼容性和提示性,我们再次定义属性,修改为:

       这样做后,Android Studio将提供属性值选择提示。

使用recyclerview要导入什么包

       1、打开SDK Manager,在Extras树下找到Android Support Library,下载好支持包。RecyclerView在v7-版本就出来了。我这里不用更新了,说明是最新的,怎么可能不行呢?

       2、检查app的build.gradle。里面的的v7版本也都是.2.1

       3、打开External Libraries,直接找到类,也没有

       4、查看appcompat-v7-.2.1的属性,里面有源代码引用的位置,在SDK目录下:\extras\android

       \m2repository\com\android\support\appcompat-v7\.2.1\appcompat-v7-.2.1-sources.jar

       5、打开上面目录后,发现里面有appcompat-v7,而且里面最新版本就是.2.1

       6、按照第2步的思路,试试直接编译进来是否OK。按照目录结构,在app的build.gradle的dependencies最后添加了一句:

       compile ‘com.android.support:recyclerview-v7:.2.1’

       7、Build——Clean Project。等待Clean完毕后,在External Libraries中看到了期待中的recyclerview

       8、能导入包了、

       åœ¨\extras\android\support\v7\recyclerview\libs 目录下发现有android-support-v7-recyclerview.jar。要是上面的方法不行,这就是第二种解决办法了,直接导入到libs中了

Android RecyclerView使用简述

       Android中的RecyclerView是一个功能强大且灵活的视图组件,它能够展示一系列的数据项。与传统的ListView相比,RecyclerView具有更高的性能和更多的灵活性。使用RecyclerView时,需要创建一个Adapter来管理数据和视图,这里的Adapter与ListView的Adapter相似。同时,还需要创建一个LayoutManager来管理RecyclerView中子视图的排列方式,并实现滚动效果。除此之外,RecyclerView还支持添加和移除子视图,以及支持添加和移除动画效果等功能。

       提供包括软件源代码、软件需求规格说明书、软件设计报告、软件测试报告、软件用户手册在内的相关文档。

       以下是使用RecyclerView的几个简单步骤:

       1. 在build.gradle文件中添加RecyclerView的依赖库:

       implementation 'androidx.recyclerview:recyclerview:1.1.0'

       2. 在布局文件中添加RecyclerView组件:

       android:id="@+id/recyclerView"

       android:layout_width="match_parent"

       android:layout_height="match_parent" />

       3. 创建RecyclerView的Adapter:

       public class MyAdapter extends RecyclerView.Adapter {

       private List mData; //数据源

       //自定义ViewHolder,用于管理子视图的View对象

       static class ViewHolder extends RecyclerView.ViewHolder {

       TextView title;

       ViewHolder(View itemView) {

       super(itemView);

       title = itemView.findViewById(R.id.title);

       }

       }

       //构造方法,传入数据源

       public MyAdapter(List data) {

       mData = data;

       }

       //创建ViewHolder对象并返回

       @Override

       public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

       View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);

       ViewHolder holder = new ViewHolder(view);

       return holder;

       }

       //绑定数据到ViewHolder中的View对象

       @Override

       public void onBindViewHolder(ViewHolder holder, int position) {

       holder.title.setText(mData.get(position));

       }

       //返回数据源的长度

       @Override

       public int getItemCount() {

       return mData.size();

       }

       }

       4. 创建RecyclerView的LayoutManager:

       LinearLayoutManager layoutManager = new LinearLayoutManager(this);

       recyclerView.setLayoutManager(layoutManager);

       5. 设置Adapter:

       MyAdapter adapter = new MyAdapter(dataList);

       recyclerView.setAdapter(adapter);

Android--RecyclerView嵌套RecyclerView优化

       使用RecyclerView嵌套RecyclerView时,用户常常会遇到操作不流畅、卡顿的问题。

       在RecyclerView的源码中,onInterceptTouchEvent方法负责处理事件。特别是MOVE事件,RecyclerView仅进行了距离判断,当滑动距离超过系统默认阈值时,RecyclerView会自行滑动。这就解释了为什么在水平滑动时,子RecyclerView无法接收到Touch事件。为了解决这个问题,我们修改了拦截方法,只有在水平滑动距离大于竖直滑动距离时,RecyclerView才拦截事件。

       然而,在子RecyclerView快速滑动且尚未停止时,如果我们尝试竖直滑动,会发现父RecyclerView无法接收到Touch事件。为了解决这个问题,我们找到了requestDisallowInterceptTouchEvent方法并进行了修改。

       以下是相关视频和资源:

       Android进阶开发:RecyclerView 内存管理与设计思想讲解

RecyclerView详解

       RecyclerView作为ListView和GridView的替代,但是和ListView不一样的是,RecyclerView不再负责Item的摆放等显示方面的功能,所有和布局、绘制等方面的工作都拆分成不同的类进行管理。

        RecyclerView与ListView的不同点,主要在于以下几个特性:

        如果你想使用RecyclerView,需要做以下操作:

        我们可以从下图更直观的了解到RecyclerView的基本结构:

        RecyclerView不再负责Item视图的布局及显示,所以RecyclerView也没有为Item开放OnItemClick等点击事件。可以通过以下方式进行:因为在ViewHolder我们可以拿到每个Item的根布局,所以如果我们为根布局设置单独的OnClick监听并将其开放给Adapter,那么就可以在组装RecyclerView时就能够设置ItemClickListener,只不过这个Listener不是设置到RecyclerView上而是设置到Adapter。

        多Item布局,getItemViewType方法,用法和ListView没有任何区别,这里要注意的是函数onCreateViewHolder(ViewGroup parent, int viewType)的第二个参数就是View的类型,可以根据这个类型判断去创建不同item的ViewHolder,从而完成多Item布局。

        在RecylerView中,Adapter扮演着两个角色:一是根据不同viewType创建与之相应的的itemView,二是访问数据集合并将数据绑定到正确的View上。这就需要我们实现以下两个函数:

        另外我们还需要重写另一个方法,像ListView-Adapter那样,同样地告诉RecyclerView-Adapter列表Items的总数:

        ViewHolder描述RecylerView中某个位置的itemView和元数据信息,属于Adapter的一部分,其实现类通常用于保存findViewById的结果。 主要元素组成有:

        关于ViewHolder,这里主要介绍mFlags:

        FLAG_BOUND——ViewHolder已经绑定到某个位置,mPosition、mItemId、mItemViewType都有效

        FLAG_UPDATE——ViewHolder绑定的View对应的数据过时需要重新绑定,mPosition、mItemId还是一致的

        FLAG_INVALID——ViewHolder绑定的View对应的数据无效,需要完全重新绑定不同的数据

        FLAG_REMOVED——ViewHolder对应的数据已经从数据集移除

        FLAG_NOT_RECYCLABLE——ViewHolder不能复用

        FLAG_RETURNED_FROM_SCRAP——这个状态的ViewHolder会加到scrap list被复用。

        FLAG_CHANGED——ViewHolder内容发生变化,通常用于表明有ItemAnimator动画

        FLAG_IGNORE——ViewHolder完全由LayoutManager管理,不能复用

        FLAG_TMP_DETACHED——ViewHolder从父RecyclerView临时分离的标志,便于后续移除或添加回来

        FLAG_ADAPTER_POSITION_UNKNOWN——ViewHolder不知道对应的Adapter的位置,直到绑定到一个新位置

        FLAG_ADAPTER_FULLUPDATE——方法addChangePayload(null)调用时设置

        LayoutManager主要作用是,测量和摆放RecyclerView中itemView,以及当itemView对用户不可见时循环复用处理。

        当我们想在某些item上加一些特殊的UI时,往往都是在itemView中先布局好,然后通过设置可见性来决定哪些位置显示不显示。RecyclerView将itemView和装饰UI分隔开来,装饰UI即ItemDecoration,主要用于绘制item间的分割线、高亮或者margin等。其源码如下:

        过去AdapterView的item项操作往往是没有动画的。现在RecyclerView的ItemAnimator使得item的动画实现变得简单而样式丰富,我们可以自定义item项不同操作(如添加,删除)的动画效果。

        Recycler用于管理已经废弃或与RecyclerView分离的(scrapped or detached)item view,便于重用。Scrapped view指依附于RecyclerView,但被标记为可移除或可复用的view。

        LayoutManager获取Adapter某一项的View时会使用Recycler。当复用的View有效(clean)时,View能直接被复用,反之若View失效(dirty)时,需要重新绑定View。对于有效的View,如果不主动调用request layout,则不需要重新测量大小就能复用。在分析Recycler的复用原理之前,我们先了解下如下两个类:

        RecyclerViewPool用于多个RecyclerView之间共享View。只需要创建一个RecyclerViewPool实例,然后调用RecyclerView的setRecycledViewPool(RecycledViewPool)方法即可。RecyclerView默认会创建一个RecyclerViewPool实例。

        通过源码我们可以看出mScrap是一个<viewType, List>的映射, mMaxScrap 是一个<viewType, maxNum>的映射,这两个成员变量代表可复用View池的基本信息。调用 setMaxRecycledViews(int viewType, int max) 时,当用于复用的 mScrap 中viewType对应的ViewHolder个数超过maxNum时,会从列表末尾开始丢弃超过的部分。调用 getRecycledView(int viewType) 方法时从 mScrap 中移除并返回viewType对应的List的末尾项。

        ViewCacheExtension是一个由开发者控制的可以作为View缓存的帮助类。调用Recycler.getViewForPosition(int)方法获取View时,Recycler先检查attached scrap和一级缓存,如果没有则检查ViewCacheExtension.getViewForPositionAndType(Recycler, int, int),如果没有则检查RecyclerViewPool。注意:Recycler不会在这个类中做缓存View的操作,是否缓存View完全由开发者控制。

        现在大家熟悉了RecyclerViewPool和ViewCacheExtension的作用后,下面开始介绍Recycler。 如下是Recycler的几个关键成员变量和方法:

        获取某个位置需要展示的View,先检查是否有可复用的View,没有则创建新View并返回。具体过程为:

        注:以上每步匹配过程都可以匹配position或itemId(如果有stableId)。

相关栏目:休闲