RecyclerView 使用总结以及常见问题解决方案

2023-05-16

1 RecycleView设置了数据不显示

本文主要讲一下我个人对于RecycleView的使用的一些思考以及一些常见的问题怎么解决。先来看一下使用RecycleView时常见的问题以及一些需求。

这个往往是因为你没有设置LayoutManger。 没有LayoutManger的话RecycleView是无法布局的,即是无法展示数据,下面是RecycleView布局的源码:

void dispatchLayout() {  //没有设置 Adapter 和 LayoutManager, 都不可能有内容
    if (mAdapter == null) {
            Log.e(TAG, "No adapter attached; skipping layout");
            // leave the state in START
            return;
    }
    if (mLayout == null) {
            Log.e(TAG, "No layout manager attached; skipping layout");
            // leave the state in START
            return;
    }
}

即Adapter或Layout任意一个为null,就不会执行布局操作。

2 RecyclerView数据多次滚动后出现混乱

RecycleView在滚动过程中ViewHolder是会不断复用的,因此就会带着上一次展示的UI信息(也包含滚动状态), 所以在设置一个ViewHolder的UI时,尽量要做resetUi()操作:

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        holder.itemView.resetUi()
        ...设置信息UI 
}

resetUi()这个方法就是用来把Ui还原为最初的操作。当然如果你的每一次bindData操作会对每一个UI对象重新赋值的话就不需要有这个操作。就不会出现itemView的UI混乱问题。

3 如何获取当前 ItemView展示的位置

我们可能会有这样的需求: 当RecycleView中的特定Item滚动到某个位置时做一些操作。比如某个Item滚动到顶部时,展示搜索框。那怎么实现呢?

首先要获取的Item肯定处于数据源的某个位置并且肯定要展示在屏幕。因此我们可以直接获取这个Item的ViewHolder:

val holder = recyclerView.findViewHolderForAdapterPosition(speicalItemPos) ?: return

val offsetWithScreenTop = holder.itemview.top

if(offsetWithScreenTop <= 0){  //这个ItemView已经滚动到屏幕顶部
    //do something
}

免费获取安卓开发架构的资料(包括Fultter、高级UI、性能优化、架构师课程、 NDK、混合式开发(ReactNative+Weex)和一线互联网公司关于android面试的题目汇总可以加群:936332305 / 群链接:点击链接加入群聊【安卓开发架构】:https://jq.qq.com/?_wv=1027&k=515xp64

在这里插入图片描述

4 如何在固定时间内滚动一款距离

smoothScrollToPosition()大家应该都用过,如果滚动2、3个Item。那么整体的用户体验还是非常棒的。
但是,如果你滚动20个Item,那这个体验可能就会就很差了,因为用户看到的可能是下面这样子:

在这里插入图片描述

恩,滚动的时间有点长。因此对于这种case其实我推荐直接使用scrollToPosition(20),效果要比这个好。

可是如果你就是想在200ms内从Item 1滚到Item 20怎么办呢?

可以参考StackOverflow上的一个答案。大致写法是这样的:
https://stackoverflow.com/questions/28803319/android-control-smooth-scroll-over-recycler-view/28853254

//自定义 LayoutManager, Hook smoothScrollToPosition 方法
recyclerView.layoutManager = object : LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) {
    override fun smoothScrollToPosition(recyclerView: RecyclerView?, state: RecyclerView.State?, position: Int) {
        if (recyclerView == null) return
        val scroller = get200MsScroller(recyclerView.context, position * 500)
        scroller.targetPosition = position
        startSmoothScroll(scroller)
    }
}

private fun get200MsScroller(context: Context, distance: Int): RecyclerView.SmoothScroller = object : LinearSmoothScroller(context) {
    override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float {
        return (200.0f / distance) //表示滚动 distance 花费200ms
    }
}

比如上面我把时间改为10000,那么就是用10s的时间完成这个滚动操作。

5 如何测量当前RecyclerView的内容高度

先描述一下这个需求: RecyclerView中的每个ItemView的高度都是不固定的。

我数据源中有20条数据,在没有渲染的情况下我想知道这个20条数据被RecycleView渲染后的总共高度, 比如下面这个图片:
在这里插入图片描述

怎么做呢?

我的思路是利用LayoutManager来测量,因为RecycleView在对子View进行布局时就是用LayoutManager来测量子View来计算还有多少剩余空间可用,源码如下:

void layoutChunk(RecyclerView.Recycler recycler, 
    RecyclerView.State state,LayoutState layoutState, LayoutChunkResult result) {
    View view = layoutState.next(recycler);   //这个方法会向 recycler要一个View
    ...
    measureChildWithMargins(view, 0, 0);  //测量这个View的尺寸,方便布局, 这个方法是public
    ...
}

所以我们也可以利用layoutManager.measureChildWithMargins方法来测量,代码如下:

private fun measureAllItemHeight():Int {
    val measureTemplateView = SimpleStringView(this)
    var totalItemHeight =
    dataSource.forEach {  //dataSource当前中的所有数据
        measureTemplateView.bindData(it, 0) //设置好UI数据
        recyclerView.layoutManager.measureChild(measureTemplateView, 0, 0) //调用源码中的子View的测量方法
        currentHeight += measureTemplateView.measuredHeight
    }
    return totalItemHeight
}

但要注意的是,这个方法要等布局稳定的时候才可以用,如果你在Activity.onCreate中调用,那么应该post一下, 即:

recyclerView.post{
    val totalHeight = measureAllItemHeight()
}

6 IndexOutOfBoundsException

IndexOutOfBoundsException: Inconsistency detected. Invalid item position 5(offset:5).state:9

这个异常通常是由于Adapter的数据源大小改变没有及时通知RecycleView做UI刷新导致的,或者通知的方式有问题。 比如如果数据源变化了(比如数量变少了),而没有调用notifyXXX, 那么此时滚动RecycleView就会产生这个异常。

解决办法很简单 : Adapter的数据源改变时应立即调用adapter.notifyXXX来刷新RecycleView 。

分析一下这个异常为什么会产生:

在RecycleView刷新机制一文介绍过,RecycleView的滚动操作是不会走RecycleView的正常布局过程的,它直接根据滚动的距离来摆放新的子View。 想象一下这种场景,原来数据源集合中
有8个Item,然后删除了4个后没有调用adapter.notifyXXX(),这时直接滚动RecycleView,比如滚动将要出现的是第6个Item,LinearLayoutManager就会向Recycler要第6个Item的View:

Recycler.tryGetViewHolderForPositionByDeadline():

//position是6 
final int offsetPosition = mAdapterHelper.findPositionOffset(position);  
//但此时  mAdapter.getItemCount() = 5
if (offsetPosition < 0 || offsetPosition >= mAdapter.getItemCount()) {    
        throw new IndexOutOfBoundsException("Inconsistency detected. Invalid item "
                + "position " + position + "(offset:" + offsetPosition + ")."
                + "state:" + mState.getItemCount() + exceptionLabel());
}

即这时就会抛出异常。如果调用了adapter.notifyXXX的话,RecycleView就会进行一次完全的布局操作,就不会有这个异常的产生。

其实还有很多异常和这个原因差不多,比如:IllegalArgumentException: Scrapped or attached views may not be recycled. isScrap:false(很多情况也是由于没有及时同步UI和数据)

所以在使用RecycleView时一定要注意保证数据和UI的同步,数据变化,及时刷新RecyclerView, 这样就能避免很多crash。

7 如何对RecyclerView进行封装

现在很多app都会使用RecyclerView来构建一个页面,这个页面中有各种卡片类型。为了支持快速开发我们通常会对RecycleView的Adapter做一层封装来方便我们写各种类型的卡片,下面这种封装是我认为一种比较好的封装:

/**
 * 对 RecyclerView.Adapter 的封装。方便业务书写。 业务只需要处理 (UI Bean) -> (UI View) 的映射逻辑即可
 */
abstract class CommonRvAdapter<T>(private val dataSource: List<T>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val item = createItem(viewType)
        return CommonViewHolder(parent.context, parent, item)
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val commonViewHolder = holder as CommonViewHolder<T>
        commonViewHolder.adapterItemView.bindData(dataSource[position], position)
    }

    override fun getItemCount() = dataSource.size

    override fun getItemViewType(position: Int): Int {
        return getItemType(dataSource[position])
    }

    /**
     * @param viewType 需要创建的ItemView的viewType, 由 {@link getItemType(item: T)} 根据数据产生
     * @return 返回这个 viewType 对应的 AdapterItemView
     * */
    abstract fun createItem(viewType: Int): AdapterItemView<T>

    /**
     * @param T 代表dataSource中的一个data
     *
     * @return 返回 显示 T 类型的data的 ItemView的 类型
     * */
    abstract fun getItemType(item: T): Int

    /**
     * Wrapper 的ViewHolder。 业务不必理会RecyclerView的ViewHolder
     * */
    private class CommonViewHolder<T>(context: Context?, parent: ViewGroup, val adapterItemView: AdapterItemView<T>)
    //这一点做了特殊处理,如果业务的AdapterItemView本身就是一个View,那么直接当做ViewHolder的itemView。 否则inflate出一个view来当做ViewHolder的itemView
        : RecyclerView.ViewHolder(if (adapterItemView is View) adapterItemView else LayoutInflater.from(context).inflate(adapterItemView.getLayoutResId(), parent, false)) {
        init {
            adapterItemView.initViews(itemView)
        }
    }
}

/**
 * 能被 CommonRvAdapter 识别的一个 ItemView 。 业务写一个RecyclerView中的ItemView,只需要实现这个接口即可。
 * */
interface AdapterItemView<T> {

    fun getLayoutResId(): Int

    fun initViews(var1: View)

    fun bindData(data: T, post: Int)
}

为什么我认为这是一个不错的封装?

业务如果写一个新的Adapter的话只需要实现两个方法:

abstract fun createItem(viewType: Int): AdapterItemView<T>

abstract fun getItemType(item: T): Int

即业务写一个Adapter只需要对 UI 数据 -> UI View 做映射即可, 不需要关心RecycleView.ViewHolder的逻辑。

因为抽象了AdapterItemView, ItemView足够灵活

由于封装了RecycleView.ViewHolder的逻辑,因此对于UI item view业务方只需要返回一个实现了AdapterItemView的对象即可。

可以是一个View,也可以不是一个View, 这是因为CommonViewHolder在构造的时候对它做了兼容:

val view : View = 
    if 
        (adapterItemView is View) adapterItemView 
    else 
        LayoutInflater.from(context).inflate(adapterItemView.getLayoutResId(), parent, false)

即如果实现了AdapterItemView的对象本身就是一个View,那么直接把它当做ViewHolder的itemview,否则就inflate出一个View作为ViewHolder的itemview。

其实这里我比较推荐实现AdapterItemView的同时直接实现一个View,即不要把inflate的工作交给底层框架。比如这样:

private class SimpleStringView(context: Context) : FrameLayout(context), AdapterItemView<String> {

    init {
        LayoutInflater.from(context).inflate(getLayoutResId, this)  //自己去负责inflate工作
    }

    override fun getLayoutResId() = R.layout.view_test

    override fun initViews(var1: View) {}

    override fun bindData(data: String, post: Int) { simpleTextView.text = data }
}

为什么呢?原因有两点 :

  1. 继承自一个View可复用性很高,封装性很高。即这个SimpleStringView不仅可以在RecycleView中当一个itemView,也可以在任何地方使用。
  2. 方便单元测试,直接new这个View就好了。

但其实直接继承自一个View是有坑的,即上面那行inflate代码LayoutInflater.from(context).inflate(getLayoutResId, this)

它其实是把xml文件inflate成一个View。然后add到你ViewGroup中。因为SimpleStringView就是一个FrameLayout,所有相当于add到这个FrameLayout中。这其实就有问题了。

比如你的布局文件是下面这种:

<FrameLayout>.....</FrameLayout>

这就相当于你可能多加了一层无用的父View。

所有如果是直接继承自一个View的话,我推荐这样写:

  1. 布局文件中尽可能使用标签来消除这层无用的父View, 即上面的改为
  2. 很简单的布局的可以直接在代码中写,不要inflate。这样其实也可以减少inflate的耗时,稍微提高了一点性能吧。

当然,如果你不需要对这个View做复用的话你可以不用直接继承自View,只实现AdapterItemView接口, inflate的工作交给底层框架即可。这样是不会产生上面这个问题的。

免费获取安卓开发架构的资料(包括Fultter、高级UI、性能优化、架构师课程、 NDK、混合式开发(ReactNative+Weex)和一线互联网公司关于android面试的题目汇总可以加群:936332305 / 群链接:点击链接加入群聊【安卓开发架构】:https://jq.qq.com/?_wv=1027&k=515xp64

在这里插入图片描述

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

RecyclerView 使用总结以及常见问题解决方案 的相关文章

  • RecyclerView 使用总结以及常见问题解决方案

    1 RecycleView设置了数据不显示 本文主要讲一下我个人对于RecycleView的使用的一些思考以及一些常见的问题怎么解决 先来看一下使用RecycleView时常见的问题以及一些需求 这个往往是因为你没有设置LayoutMang
  • RecyclerView预加载

    private boolean isLoadingMore 61 false 是否预加载 recyclerView addOnScrollListener new RecyclerView OnScrollListener 64 Overr
  • 字节4轮面试,3轮都问了RecyclerView

    阿里面试总共4轮 xff0c 其中有3轮面试都问到了RecyclerView的问题 面试的点各不相同 xff0c 有原理 嵌套问题 有缓存实现 xff0c 但是最终都是殊途同归 xff0c 所有的问题都汇集在 如何对RecyclerView
  • recycler recyclerview snaphelper

    转载 xff1a 让你明明白白的使用RecyclerView SnapHelper详解 简书
  • RecyclerView 隐藏部分分割线

    在项目中遇到复杂点的RecyclerView xff0c 可能会有隐藏部分分割线的需求 xff0c 例如item1和item3之间的分割线隐藏 xff0c item4和item5之间的分割线隐藏等 在看了文档里的ItemDecoration
  • RecyclerView中倒计时item的优雅方案

    本文介绍在RecyclerView中使用倒计时楼层 xff0c 并且每秒刷新显示倒计时 没有纠结于样式 xff0c 主要介绍代码结构和设计模式 先看一下效果 xff1a 我们采取的是观察者模式的方法 xff0c 启动一个handler xf
  • RecyclerView系列 - RecyclerView的基本使用

    文章欢迎转载 转载请注明出处 文章首发于 Karen Chia 程序人生 RecyclerView系列 RecyclerView的基本使用 按照惯例 先上效果图 效果图不是我想要的效果 怎么办 查看关于 RecyclerView 系列的其它
  • RecyclerView放入正方形布局

    在使用RevyclerView时 有个需求 列表列数不固定 每个item的高度要和宽度相等具体看图 三列 四列 五列
  • Android RecyclerView对应的适配器中方法的执行顺序和具体作用详解

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 1 代码的执行顺序为 首次进入会先调用getItemCount 返回条目的个数 之后会分别调用 getIt
  • RecyclerView流式布局StaggeredGridLayoutManager,重排序问题

    RecyclerView天然支持流式布局 只需要设置layoutManager为StaggeredGridLayoutManager 不过如果item中有图片 由于图片异步加载 会导致item布局变化 这倒也没什么 关键是在holder复用
  • android如果将recyclerView嵌套进NestedScrollView中,可能导致加载更多一直执行

    今天在使用BaseQuickAdapter对RecyclerView进行绑定的时候 支持加载更多 却发现一直自动进行加载更多 最后发现问题是因为在NestedScrollView中的缘故 还不知为什么
  • Android RecyclerView的notify方法和动画的刷新详解

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 前言 本篇讲解了RecyclerView关于通知列表刷新的常用的notify方法 和RecyclerVie
  • Android:RecyclerView 的使用,有这一篇就够了

    谨以文章记录学习历程 如有错误还请指明 RecyclerView 简介 首先 可以理解 RecyclerView 是 ListView 的升级版 更加灵活 同时由于封装了 ListView 的部分实现 导致其使用更简单 结构更清晰 从名字
  • 蜗牛君漫聊动态布局框架(二):核心功能的思路与实现

    Hello 大家好 我是蜗牛君 我们又见面了 本篇文章是蜗牛君漫聊动态布局框架的第二篇 上一篇中我们讲解了框架的大致思路 以及复习了一下RecyclerView的基础使用方式 那么本篇文章我们就正式开始框架的搭建了 首先我们要做一件事情 就
  • 如何让RecyclerView滑动到底部?

    在做这个功能时 使用scroll的任何一个方法 发现它每次都只滑到了一半 今天终于解决了 解决方法如下 LinearLayoutManager linearLayoutManager LinearLayoutManager recycler
  • Android从源码分析RecyclerView四级缓存复用机制一(缓存ViewHolder)

    RecyclerView相比较ListView先说多了多布局和缓存 目前已经在Android列表中大量普及使用 面试中也经常问到 所以对于RecyclerView的四级缓存机制也叫复用回收机制的分析很有必要 这部分很重要请 全村人来听 先说
  • 蜗牛君漫聊动态布局框架(三):适配器与创建者

    大家好 欢迎来到蜗牛君漫聊动态布局框架专题 上篇文章中我们介绍完了框架的核心功能实现 本篇继续介绍剩下的所有功能 不同类型ViewHolder的动态创建已经完成 接下来我们要实现数据与布局的中间件 适配器 Adapter 代码实现 中间件
  • RecyclerView实现九宫格和点击事件

    想要实现的效果如下 开始界面 点击界面展示 在屏幕中间弹出一个对话框 效果就如同将图片放大一样 不过当然 这里的图片放大并非真正意义上的拉伸 而是展示出较大的那张图片 若是不打算用两张图片 也可以自定义大小 这里因为只是简单的demo 也为
  • Android RecyclerView的StaggeredGridLayoutManager布局,实现交错排列的子元素分组

    先看实现的效果图 设计背景 现在的产品对设计的需求越来越多样化 如附录文章2是典型的联系人分组RecyclerView 子元素排列到一个相同的组 但是有些时候 UI要求把这些元素不是垂直方向的 而是像本文开头的图中所示样式排列 这就需要用S
  • Android RecyclerView最全使用详解

    本文目录 RecyclerView概述 RecyclerView使用 基础篇 第一步 添加RecyclerView 第二步 添加布局文件 第三步 添加逻辑代码 运行效果 RecyclerView使用 进阶篇 布局管理器 线性布局管理器 网格

随机推荐

  • pci总线协议学习笔记——PCI总线基本概念

    1 pci总线概述 1 PCI xff0c 外设组件互连标准 Peripheral Component Interconnection xff0c 是一种由英特尔 xff08 Intel xff09 公司1991年推出的用于定义局部总线的标
  • RK3568芯片开发笔记——调试pwm控制红外功能

    1 PWM介绍 参考博客 xff1a ARM芯片开发 xff08 S5PV210芯片 xff09 定时器 看门狗 RTC xff1b 2 配置pwm功能的方法 1 内核层 xff1a 内核代码里有pwm子系统 xff0c 里面有pwm相关函
  • 海思芯片(hi3536av100)启动模式选择

    1 支持多种模式可配置 1 支持BootRom启动 2 支持从 SPI NOR Flash 启动 3 支持从 SPI NAND Flash 启动 4 支持从 eMMC 启动 5 支持 PCIe 从片启动 2 启动方式的选择 BOOT SEL
  • C语言头文件详解

    1 include的作用 简单一句话 xff1a 在include的地方 xff0c 把头文件里的内容原封不动的复制到引用该头文件的地方 2 头文件的引用 头文件引用有两种形式 xff1a include lt stdio h gt 和 i
  • wps云文档 wps自动备份怎么设置和取消

    转载请说明来源于 34 厦门SEO 34 本文地址 xff1a http www 96096 cc Article 169633 html wps云文档 WPS 为用户提供了自动备份的功能 xff0c 这为用户带来了方便的同时也给用户带来了
  • IDEA中Spring的配置使用

    IDEA中Spring的配置使用 1 首先创建JavaEE Web Application项目 xff0c 勾选Spring xff0c Libraries选择Set up library later xff08 有spring jar包的
  • content-type类型总结

    content type content type是http请求的响应头和请求头的字段 当作为响应头时 xff0c 告诉客户端实际返回的内容的内容类型 作为请求头时 xff0c 客户端告诉服务器实际发送的数据类型 前端开发过程中 xff0c
  • 外包干了6年,寄了

    前两天有读者想我资讯 xff1a 我是一名Android工程师 xff0c 工作已经四年多快五年了 现在正在找工作 xff0c 由于一直做的都是外包的项目 技术方面都不是很深入 xff0c 现在找工作都是会问一些 xff0c 四大组件 xf
  • java.lang.RuntimeException: Unable to instantiate activity ComponentInfo(不能实例化)异常解决

    java lang RuntimeException Unable to instantiate activity ComponentInfo xff08 不能实例化 xff09 异常解决 一 可能出现的原因及解决方法 xff1a xff0
  • Error:java: Compilation failed: internal java compiler error 的解决过程

    1 错误描述 xff1a IDEA导入一个新的项目 xff0c 运行时包编译失败 2 错误原因 这个错误的原因是因为 JDK 版本问题 xff0c 有两个原因 xff0c 一个是编译器版本不匹配 xff0c 一个是当前项目 JDK 版本不支
  • SpringCloud-21-Hystrix全局降级和解耦降级逻辑

    8 6 全局降级方法 通过上面的方式实现服务降级时 xff0c 需要针对所有业务方法都配置降级方法 xff0c 这极有可能会造成代码的急剧膨胀 为了解决该问题 xff0c 我们还可以为所有业务方法指定一个全局的回退方法 xff0c 具体步骤
  • Linux学习-61-Linux系统服务管理

    14 Linux系统服务管理 系统服务 xff1a 服务是在后台运行的应用程序 xff0c 并且可以提供一些本地系统或网络的功能 Linux 中常见的服务有那些 xff0c 这些服务怎么分类 xff0c 服务如何启动 xff0c 服务如何自
  • Linux学习-84-安装PHP

    17 13 安装PHP PHP xff08 PHP xff1a Hypertext Preprocessor递归缩写 xff09 中文名字是 xff1a 超文本预处理器 xff0c 是一种广泛使用的通用开源脚本语言 xff0c 适合于Web
  • redis学习-33-SpringBoot整合redis

    36 SpringBoot整合redis SpringBoot操作数据 xff1a 使用spring data项目 例如 xff1a jpa jdbc mongodb redis SpringData也是和SpringBoot齐名的项目 x
  • redis学习-34-PHP/Python使用Redis

    37 PHP使用Redis 首先需要熟练掌握 PHP 语言 xff0c 再者是已经安装了 PHP Redis 扩展程序 37 1 安装扩展程序 首先下载 PHP Redis 扩展程序 xff0c 下载的扩展程序要与 Redis 版本相符合
  • redis学习-35-Redis配置项汇总

    40 配置项汇总 对 Redis 的常用配置项和基本命令做简单的总结 xff0c 可以把本章看做简版的速查手册 不过 xff0c 需要注意的是由于 Redis 不同版本的差异 xff0c 配置项会多少存在一些不同 xff0c 但总体的来说
  • 韦东山:机会总是留给有准备的人(转)

    最近电子发烧友 xff08 以下称 39 发烧友 39 xff09 采访了韦东山老师 xff0c 本文是采访原稿 xff0c 展示出来让大家更深入了解韦老师的同时也进一步学习嵌入式Linux经验 机会总是留给有准备的人 发烧友 为什么要学习
  • matplotlib-animation--制作动画--制作各种图形-圆形矩形三角形

    目录 各个图形覆盖的问题 1 xff0c 画矩形并让其动起来 2 xff0c 画一个三角形 xff1a 动起来 xff01 3 xff0c 画一个三角形让其自动顺时针旋转 本教程基于前面的animation基础 xff0c 让各种图形动起来
  • 使用TS开发小程序中遇到的问题

    在使用ts开发小程序的过程中 xff0c 遇到了一些开发工具和关于ts的使用上的一些问题 xff0c 并记录解决方法 1 ts开发过程中类型指定问题 Type 39 number undefined 39 is not assignable
  • RecyclerView 使用总结以及常见问题解决方案

    1 RecycleView设置了数据不显示 本文主要讲一下我个人对于RecycleView的使用的一些思考以及一些常见的问题怎么解决 先来看一下使用RecycleView时常见的问题以及一些需求 这个往往是因为你没有设置LayoutMang