IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android:处理RecyclerView局部刷新视图导致闪烁,以及TextView多行设置ellipsize失效的问题 -> 正文阅读

[移动开发]Android:处理RecyclerView局部刷新视图导致闪烁,以及TextView多行设置ellipsize失效的问题

RecyclerView局部刷新视图导致闪烁

问题:RecyclerView 调用notifyItemChanged()方法更新单个Item时,此Item有闪烁
因为RecyclerView 默认实现了一个DefaultItemAnimator,如果RecyclerView 的item布局过于复杂且包含 重新测量等复杂步骤的时候,就会产生闪烁。所以最好的解决办法就是不产生动画效果。
看到网上有很多的设置方法。最常见的是关闭,是这么写的。

 recyclerView.getItemAnimator().setAddDuration(0);
recyclerView.getItemAnimator().setChangeDuration(0);
recyclerView.getItemAnimator().setMoveDuration(0);
recyclerView.getItemAnimator().setRemoveDuration(0);
((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);

解决:以上方法,不知道大家是否可以,但是我测下来还是有点问题,虽然动画间隔设置为了0,但是还是有执行动画的操作,所以简单粗暴的设置方法,直接设置animator为null。简单有效

recyclerView.setItemAnimator(null);

TextView设置多行后ellipsize失效的问题

问题:我这里要求是设置textview最多展示两行,然后多出来的中间显示省略号,xml布局设置了maxlines = 2,ellipsize="middle"但是没有效果。。。。。
没办法只能自己实现了。最终决定借助ViewTreeObserver来实现这个效果
当监听到布局完成之后,获取到textView当前的总行数。判断如果大于需要限定的行数,就开始处理。首先使用getLineEnd获取指定行最后一个字符后的文本偏移量(文字数量)。根据获取到的文字数量截取字符串,然后重新设置textview就可以了。
解决:具体代码如下所示:

    open fun dealMiddleNoEffect(tv: TextView, lines: Int = 2) {
        val viewTreeObserver = tv.viewTreeObserver
        viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
            override fun onGlobalLayout() {
                if (viewTreeObserver.isAlive) {
                    //回调过来之后直接移除监听
                    viewTreeObserver.removeOnGlobalLayoutListener(this)
                }
                //处理判断大于多少行时进行改变
                if (viewTreeObserver.isAlive && tv.lineCount > lines) {
                    val lineEnd = tv.layout.getLineEnd(lines)
                    val allText = tv.text
                    val text = lineEnd.let {
                        val i = (it - 3) / 2
                        "${allText.substring(0, i)}...${allText.substring(allText.length - i + 3, allText.length)}"
                    }
                    tv.text = text
                }

            }
        })

    }

扩展一下:在onCreate中获取view的宽高?
方法一:使用MeasureSpec进行测量,如下所示:

fun calculateViewWidthAndHeight(view: View): Pair<Int, Int> {
    val measureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
    view.measure(measureSpec, measureSpec)
    return view.measuredWidth to view.measuredHeight
}

方法二:使用ViewTreeObserver 来获得宽高,当获得正确的宽高后,移除观察者,否则会调会多次执行

//使用 addOnGlobalLayoutListener
val observer = view.viewTreeObserver
 observer.addOnGlobalLayoutListener(object : OnGlobalLayoutListener {
     override fun onGlobalLayout() {
         //判断ViewTreeObserver 是否alive,如果存活的话移除这个观察者
         if (observer.isAlive) {
             observer.removeOnGlobalLayoutListener(this)
             //获得宽高
             val viewWidth = view.measuredWidth
             val viewHeight = view.measuredHeight
             //todo 逻辑处理
             
         }
     }
 })
 //或者使用  在执行onDraw之前已经执行了onLayout()和onMeasure(),可以得到宽高了
val observer = view.viewTreeObserver
 observer.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
     override fun onPreDraw(): Boolean {
         if (observer.isAlive) {
             observer.removeOnPreDrawListener(this)
         }
         //获得宽高
         val viewWidth = view.measuredWidth
         val viewHeight = view.measuredHeight
         return true
     }
 })
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-23 10:54:40  更:2021-07-23 10:56:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/28 16:55:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码