Android 滚动RecyclerView加载图片时的流畅度优化

实现:使用onScrollStateChanged回调检测滚动状态,并在RecyclerViewAdapter内部设置类似isScrolling的状态值来控制网络图片的加载。 
下面是代码举例:

// BaseAdapter中添加如下代码
public abstract class BaseRecyclerViewAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    ……
    protected boolean isScrolling = false;
    ……
    public void setScrolling(boolean scrolling) {
        isScrolling = scrolling;
    }
}

具体的子Adapter实现:

// 在子Adapter中的onBind里进行控制
public class SubRecyclerViewAdapter extends BaseRecyclerViewAdapter<DataGuardRanking> {
    ……
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
        RecyclerViewHolder holder = (RecyclerViewHolder) viewHolder;
        ……
        if (!TextUtils.isEmpty(data.getAvatarUrl()) && !isScrolling) {
            // 这里可以用Glide等网络图片加载库
        } else {
            holder.avatarImg.setImageResource(占位图本地资源);
        }
        super.onBindViewHolder(holder, position);
    }
}

在UI层进行监听:

// 外部对RecyclerView设置监听
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        // 查看源码可知State有三种状态:SCROLL_STATE_IDLE(静止)、SCROLL_STATE_DRAGGING(上升)、SCROLL_STATE_SETTLING(下落)
        if (newState == SCROLL_STATE_IDLE) { // 滚动静止时才加载图片资源,极大提升流畅度
            mRecyclerViewAdapter.setScrolling(false);
            mRecyclerViewAdapter.notifyDataSetChanged(); // notify调用后onBindViewHolder会响应调用
        } else
            mRecyclerViewAdapter.setScrolling(true);
        super.onScrollStateChanged(recyclerView, newState);
    }
});
mRecyclerView.setAdapter(mRecyclerViewAdapter);

原文地址:https://www.cnblogs.com/zhujiabin/p/8125578.html

时间: 2024-08-10 23:29:54

Android 滚动RecyclerView加载图片时的流畅度优化的相关文章

android listview 异步加载图片并防止错位

网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertView 但没有异步操作也不会有问题. 我简单分析一下: 当重用 convertView 时,最初一屏显示 7 条记录, getView 被调用 7 次,创建了 7 个 convertView. 当 Item1 划出屏幕, Item8 进入屏幕时,这时没有为 Item8 创建新的 view 实例, Ite

android listview 异步加载图片并防止错位+双缓存

网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertView 但没有异步操作也不会有问题. 我简单分析一下: 当重用 convertView 时,最初一屏显示 7 条记录, getView 被调用 7 次,创建了 7 个 convertView. 当 Item1 划出屏幕, Item8 进入屏幕时,这时没有为 Item8 创建新的 view 实例, Ite

又优化了一下 Android ListView 异步加载图片

写这篇文章并不是教大家怎么样用listview异步加载图片,因为这样的文章在网上已经有很多了,比如这位仁兄写的就很好: http://www.iteye.com/topic/685986 我也是因为看了这篇文章而受到了启发. 先说说这篇文章的优点把,开启线程异步加载图片,然后刷新UI显示图片,而且通过弱引用缓存网络加载的图片,节省了再次连接网络的开销. 这样做无疑是非常可取的方法,但是加载图片时仍然会感觉到轻微的卡屏现象,特别是listview里的item在进行快速滑动的时候. 我找了一下原因,

Android之批量加载图片OOM问题解决方案

一.OOM问题出现的场景和原因 一个好的app总少不了精美的图片,所以Android开发中图片的加载总是避免不了的,而在加载图片过程中,如果处理不当则会出现OOM的问题.那么如何彻底解决这个问题呢?本文将具体介绍这方面的知识. 首先我们来总结一下,在加载图片过程中出现的OOM的场景无非就这么几种: 1.  加载的图片过大 2.  一次加载的图片过多 3.  以上两种情况兼有 那么为什么在以上场景下会出现OOM问题呢?实际上在API文档中有着明确的说明,出现OMM的主要原因有两点: 1.移动设备会

android listview 异步加载图片并防止错位 解决办法

网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertView 但没有异步操作也不会有问题. 我简单分析一下: 当重用 convertView 时,最初一屏显示 7 条记录, getView 被调用 7 次,创建了 7 个 convertView. 当 Item1 划出屏幕, Item8 进入屏幕时,这时没有为 Item8 创建新的 view 实例, Ite

加载图片时,图片网址中包含中文参数,无法加载数据

网址示例: NSString *urlstr = @"http://odqaqbbj4.bkt.clouddn.com/pic_中文字段_20160921191844"; 对网址进行转码 NSString *url = [urlstr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"`#%^{}\"[]|\\

加载图片时的2种方法

1,仅加载图片,图像数据不会缓存. NSString *path = [[NSBundle mainBundle] pathForResource:@”icon” ofType:@”png”]; UIImage *image = [UIImage imageWithContentsOfFile:path]; 或 NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:“png”]; NSData *i

自定义控件,实现加载图片时透明变换

自定义控件,一般都是通过继承已有的view类,如TextView,Button...或者直接继承其父类View.这次因为要加载图片.所以继承自ImageView.并且实现了一个通过属性来控制的加载时间.首先是自定义的类 /** *知我者为我心忧,不知我者谓我何求! *[email protected] *作者 linwoain *日期 2014/11/7 9:17 */ package com.linwoain.TestAndroid.fragment; import android.conte

Android ListView异步加载图片乱序问题,原因分析及解决方案

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553 在Android所有系统自带的控件当中,ListView这个控件算是用法比较复杂的了,关键是用法复杂也就算了,它还经常会出现一些稀奇古怪的问题,让人非常头疼.比如说在ListView中加载图片,如果是同步加载图片倒还好,但是一旦使用异步加载图片那么问题就来了,这个问题我相信很多Android开发者都曾经遇到过,就是异步加载图片会出现错位乱序的情况.遇到这个问题时,不