RecyclerView延迟加载(通用图像加载器)

2024-04-06

Using Android 通用图像加载器 https://github.com/nostra13/Android-Universal-Image-Loader和 RecyclerView 异步加载图像,我遇到了与其他人相同的错误,图像混合在一起;直到它们全部加载并被缓存。

适配器代码:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.media.Image;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.TextView;

import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
import com.nostra13.universalimageloader.utils.MemoryCacheUtils;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import romina.theftest.connectivity.ImgDownloader;

/**
 * Created by romin on 18/1/2016.
 */
public class ProductRecyclerViewAdapter extends RecyclerView.Adapter {
    private List<Product> mValues;
    private Context mContext;
    private View.OnClickListener mListener;
    // Allows to remember the last item shown on screen
    private int lastPosition = -1;
    private final String OLD_DOMAIN = "";
    private final String NEW_DOMAIN = "";

    public ProductRecyclerViewAdapter(Context mContext, View.OnClickListener mListener) {
        this.mContext = mContext;
        this.mListener = mListener;
    }

    public ProductRecyclerViewAdapter(List<Product> mValues, Context mContext, View.OnClickListener mListener) {
        this(mContext, mListener);
        this.mListener = mListener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.product_list_item, parent, false);

        Log.d(ProductRecyclerViewAdapter.class.getSimpleName(), "onCreateViewHolder");
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        ViewHolder actualViewHolder = (ViewHolder) holder;
        actualViewHolder.mItem = mValues.get(position);
        actualViewHolder.mIdView.setText("" + mValues.get(position).getName());
        Log.d(ProductRecyclerViewAdapter.class.getSimpleName(), "onBindViewHolder pos " + position);

        ImageLoader imageLoader = ImageLoader.getInstance(); // Get singleton instance
        final String finalImgURL = mValues.get(position).getImgURL().toString().replaceAll(OLD_DOMAIN, NEW_DOMAIN);
            imageLoader.displayImage(finalImgURL, actualViewHolder.mImgView);

        setAnimation(actualViewHolder.mContentView, position);
    }

    public void setDataSet(List<Product> newValues) {
        mValues = newValues;
        notifyDataSetChanged();
    }


    @Override
    public int getItemCount() {
        return mValues == null ? 0 : mValues.size();
    }

    /**
     * Here is the key method to apply the animation
     */
    private void setAnimation(View viewToAnimate, int position) {
        // If the bound view wasn't previously displayed on screen, it's animated
        if (position > lastPosition) {
            Animation animation = AnimationUtils.loadAnimation(mContext, android.R.anim.slide_in_left);
            viewToAnimate.startAnimation(animation);
            lastPosition = position;
        }
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public final View mView;
        public final TextView mIdView;
        public final ImageView mImgView;
        public final TextView mContentView;
        public Product mItem;

        public ViewHolder(View view) {
            super(view);
            mView = view;
            mIdView = (TextView) view.findViewById(R.id.product_quantity_title);
            mContentView = (TextView) view.findViewById(R.id.product_quantity_title);
            mImgView = (ImageView) view.findViewById(R.id.product_quantity_image);

            mView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (null != mListener) {
                        mListener.onClick(v);
                    }
                }
            });
        }

        @Override
        public String toString() {
            return super.toString() + " '" + mContentView.getText() + "'";
        }
    }
}

我知道它一定是某种东西onBindViewHolder,因为它要求更新每个视图,但我没有更新ImageView适当地。

和图书馆没关系。在不缓存图像的情况下进行延迟加载时,也会发生相同的行为。错误是因为我不知道如何更新ImageView in onBindViewHolder .

Thanks!


您需要确保在应用程序中仅初始化一次 ImageLoader。 创建一个类并使用 Application 扩展它,然后放入 AndroidManifest.xml,如下所示:

<application
        android:name=".App"
.../>

应用类

public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        // UNIVERSAL IMAGE LOADER SETUP
        DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
                .resetViewBeforeLoading(true)
                .cacheOnDisk(true)
                .cacheInMemory(true)
                .imageScaleType(ImageScaleType.EXACTLY)
                .displayer(new FadeInBitmapDisplayer(300))
                .build();

        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
                .defaultDisplayImageOptions(defaultOptions)
                .memoryCache(new WeakMemoryCache())
                .diskCacheSize(100 * 1024 * 1024)
                .build();

        ImageLoader.getInstance().init(config);
        // END - UNIVERSAL IMAGE LOADER SETUP
    }
}

For onBindViewHolder你想知道的是:

@Override
public void onBindViewHolder(final CategoryHolder holder, final int i) {

    holder.categoryImage.setImageBitmap(null);

    if (mRow.get(i).getImage() != null && !mRow.get(i).getImage().equals("")) {
        final File image = DiskCacheUtils.findInCache(mRow.get(i).getImage(), imageLoader.getDiskCache());
        if (image!= null && image.exists()) {
            Picasso.with(getActivity()).load(image).fit().centerCrop().into(holder.categoryImage);
        } else {
            imageLoader.loadImage(mRow.get(i).getImage(), new ImageLoadingListener() {
                @Override
                public void onLoadingStarted(String s, View view) {
                    holder.categoryImage.setImageBitmap(null);
                }

                @Override
                public void onLoadingFailed(String s, View view, FailReason failReason) {

                }

                @Override
                public void onLoadingComplete(String s, View view, final Bitmap bitmap) {
                    Picasso.with(getActivity()).load(s).fit().centerCrop().into(holder.categoryImage);

                }

                @Override
                public void onLoadingCancelled(String s, View view) {

                }
            });
        }
    }else {
        holder.categoryImage.setImageBitmap(null);
    }

    holder.categoryName.setText(mRow.get(i).getName().toUpperCase());

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

RecyclerView延迟加载(通用图像加载器) 的相关文章

  • Pandas:根据是否为 ​​NaN 来移动列

    我有一个像这样的数据框 phone number 1 clean phone number 2 clean phone number 3 clean NaN NaN 8546987 8316589 8751369 NaN 4569874 N
  • Emacs 强制组织模式捕获缓冲区在新窗口中打开

    如何强制组织模式的捕获缓冲区在新窗口中打开 我试过 setq special display regexps Capture 但它不起作用 我立即看到一个新窗口 然后 org mode 进行两个垂直分割 我使用 3 个垂直分割 并将捕获缓冲
  • Sencha-touch :保存登录名/密码(保存会话,多任务)

    我有一个 Java Web 应用程序 其中移动部分是用 Sencha touch 开发的 当我启动 sencha touch 应用程序时 她询问我的登录名 密码 因为该应用程序的访问受到限制 但是我想保存用户的登录名 密码 sencha t
  • ruby 调试和黄瓜

    我在 Cucumber 中遇到了失败的情况 我想使用 ruby debug 来调试我的 Rails 控制器 但是 如果我将 调试器 添加到我想要中断的位置 它就不会停止 我尝试将 ruby debug 和 ruby gems 的 requi
  • Lua中按字符分割字符串

    我有像这样的字符串 ABC DEF 我需要将它们分开 字符并将两个部分分别分配给一个变量 在 Ruby 中 我会这样做 a b ABC DEF split 显然Lua没有这么简单的方法 经过一番挖掘后 我找不到一种简短的方法来实现我所追求的
  • 结构化 scala 案例类的自定义 json 序列化

    我有一些用于往返 scala 案例类的工作 jackson scala 模块代码 Jackson 对于平面案例类非常有用 但是当我制作一个包含其他案例类列表的案例时 我似乎需要很多代码 考虑 abstract class Message c
  • 增加浏览器缩放时 mediaelement.js 音量控制混乱

    媒体元素2 12 0 这种情况仅发生在 FF 和 Chrome 中 而不会发生在 IE 或 Opera 中 导航到具有媒体元素播放器的网站内容后 甚至导航到媒体元素首页http mediaelementjs com http mediael
  • 我可以在方法体内使用注释吗?

    允许 Java 注释的语义将它们放置在某处在函数体内 例如注释特定的函数调用 语句或表达式 例如 class MyClass void theFunc Thing thing String s null Catching NullPoint
  • Mink 不适用于 behat 3.0.12

    我安装了 Behat Mink 和其他一些相关的软件包 这是我的composer json 文件 require behat behat 3 0 6 behat symfony2 extension dev master behat min
  • 当按多列分组时,如何命名 dplyr 中的 group_split 列表

    我在 dplyr 中使用 group split 在分割了多个列后 我很难命名列表 当我们按一列分组时 我知道该怎么做here https stackoverflow com questions 57107721 how to name t
  • 提高批量请求的野兽内存使用率

    我运行这个boost beast 客户端 异步 ssl http www boost org doc libs develop libs beast example http client async ssl http client asy
  • 使用node.js/Express从HTTP重定向到HTTPS

    有什么方法可以更改我的 Web 应用程序以侦听 HTTPS 而不是 HTTP 我正在使用node js express 我需要它来侦听 HTTPS 因为我正在使用地理定位 而 Chrome 不再支持地理定位 除非从 HTTPS 等安全上下文
  • 找不到 com.google.gms:google-services:4.1.0 [重复]

    这个问题在这里已经有答案了 Bitrise 构建失败并出现以下错误 配置根项目 src 时出现问题 无法解析配置 classpath 的所有文件 找不到 com google gms google services 4 1 0 在以下位置进
  • win32 内容已更改,但除非移动窗口,否则不会显示更新

    我的 win32 GUI 内容每秒都会更改 但除非手动移动窗口 否则不会显示更新 我尝试每秒弹出一个消息框来触发窗口刷新 它成功了 因此 这证明我的内容确实发生了变化 但窗口没有更新 我希望刷新窗口而不是每次都弹出消息框 有没有这样的窗口功
  • Android 如何在按下或聚焦时使 TextView 文本变为粗体

    我的布局中有一个文本视图 我的要求是当我按下或聚焦它时 文本应该是粗体 否则应该使用普通字体 我该如何实施 使用下面的代码 TextView name TextView findViewById R id TextView01 name h
  • 如何从多模块构建中的不同模块引用 SBT 设置

    在带有子模块的多模块构建中server我写了一个自定义任务server build sbt我想在其中提到baseDirectory根项目的 这是任务 lazy val genData taskKey Unit generate files
  • Python正则表达式:如何用不同的值替换出现的每个实例?

    假设我有这个字符串 s blah blah blah 使用Python正则表达式 如何用不同的值替换 blah 的每个实例 例如 我有一个值列表v 1 2 3 你可以使用re sub打回来 http docs python org libr
  • 为什么在嵌套类上调用方法时不调用父类的静态构造函数?

    给出以下代码 为什么在 Main 的第一行之后没有调用 Outer 的静态构造函数 namespace StaticTester class Program static void Main string args Outer Inner
  • 神秘的 getClobVal()

    我有一个表 AKADMIN 其中包含 XMLTYPE 列 其名称为 XML 我想在该列中使用 getClobVal select t xml getClobVal t xml getClobVal t xml getClobVal as c
  • 替换 firebase 键中无效字符的好方法?

    我的用例是保存用户的信息 当我尝试使用用户的电子邮件地址作为密钥将数据保存到 Firebase 时 Firebase 会引发以下错误 错误 密钥无效 电子邮件受保护 cdn cgi l email protection 不能包含 因此 显然

随机推荐

  • 具有多个文件的 WCF 多部分/表单数据

    我在任何地方都找不到任何有关如何处理请求中包含多个文件的多部分 表单数据的示例 我正在尝试构建一个 WCF 服务端点 其中在一个文本文件中包含一组参数 然后是两个图像文件 总共在一篇文章中包含三个文件 使用 Fiddler 我可以构建请求
  • Spring 和 Spring MVC 框架有什么区别

    我是春天的新手 谁能告诉我 Spring 和 Spring MVC 框架有什么区别 Spring是一个很大的框架 包含很多组件 这些组件之一是 Spring MVC 它是一个允许您根据模型 视图 控制器设计模式实现 Web 应用程序的组件
  • 如何将两个STL向量的元素相加?

    这个问题很愚蠢 但我需要以一种非常有效的方式来做 它将在我的代码中一遍又一遍地执行 我有一个返回向量的函数 我必须将返回的值逐个元素添加到另一个向量中 非常简单 vector
  • 两个不同流上的operator<<(ostream&, obj) 线程安全吗?

    include
  • 为什么我不能使用 KVC 从 Objective-C 对象到 Swift 属性?

    我的团队决定新文件应该用 swift 编写 并且我在 Objective C 对象中使用 KVC 在 Swift 对象上设置属性时发现了一个奇怪的问题 我的 Objective C 设置如下属性 textObject setValue 0
  • LUIS 给出 403 错误“通话量配额”。使用创作资源 F0 在门户中进行测试时

    当我尝试测试 LUIS 应用程序时 它抛出 403 错误并显示以下消息 LUIS 的未通话量配额 正在编写 F0 定价等级 请在 9 天后重试 要增加通话量 请切换到付费等级 我正在使用 Azure 创作资源密钥层 F0 它有一个limit
  • 在单独的 TypeScript 项目之间共享接口

    tl 博士在底部 我有一个用 TypeScript 编写的网络服务器和一个用 TypeScript 编写的客户端 SPA 我的想法是共享请求和响应数据的接口 以充分利用 类型安全 我的大问题是客户端和服务器是同级文件夹 每个文件夹都有自己的
  • 子查询返回超过 1 个值。当子查询时这是不允许的

    我正在尝试使用 SQL 从 SCCM 返回 Windows 更新合规性数据 我已从内置 SSRS 报告中提取了查询 我没有为每个 colname 计算机组 运行单独的查询 而是尝试通过将 colname 声明为表并插入多个值来合并为一个查询
  • FSGetVolumeInfo 是 NSWorkspace 已弃用的 MountedLocalVolumePaths 方法的推荐替代方法吗?

    我需要获取 Mac OS X 上已安装的本地卷的列表 以前 Cocoa 类NSWorkspace had a mountedLocalVolumePaths method https developer apple com library
  • 下载弹出窗口中的内容

    下面是点击 打开窗口 时弹出窗口的 html 代码 我添加了下载按钮 在其中 一旦用户单击它 就应该下载该表 我在这里缺少一些东西 谁能帮我 我已经快到最后阶段了 唯一悬而未决的是下载内容 table border 1 tr th th t
  • VS Code 无法打开终端

    由于某种原因 vscode 停止打开集成终端 现在每次尝试打开终端时都会出现错误 我已经尝试过重新安装 Git 但到目前为止还没有任何想法 这里我留下了配置和错误的图片 我什至尝试将 bash 终端更改为 powershell 但仍然没有任
  • 数据类型的数据模板 - 如何在特定列表框中覆盖此数据模板?

    我为我的宠物项目中的一些数据类型创建了几个数据模板 这些数据模板非常酷 因为它们像魔法一样工作 无论何时何地出现在 UI 中 都会神奇地改变数据类型实例的外观 现在我希望能够在一个特定的列表框中更改这些数据类型的数据模板 这是否意味着我必须
  • 这个格式字符串有什么问题?

    我有一个像这样的字符串
  • Cygwin 中的 vim 在打开文件时将第一个字符替换为“g”

    我在 Cygwin 终端中使用 vim 一切正常 最近 我在 Cygwin 中添加了一个包 导致 vim 和其他一些组件的更新 现在 当我在 vim 中打开任何文件时 文件中的第一个字符将被替换为字符 g 我尝试删除 vimrc 以及我的主
  • Chrome 扩展程序弹出窗口不再显示

    我正在创建一个新的 Chrome 扩展程序 一切都很好 然而 今天我正在编写一个新函数 然后我看到我的扩展图标变成了灰色 当我单击该图标时 不会显示弹出窗口 有趣的一点是该扩展正在运行 没有错误日志 我把自己写的代码都注释掉了 但是没有效果
  • NHibernate:更改父级 - “删除的对象将通过级联重新保存”

    正如标题所说 基本上我想做的是改变孩子的父母 但是当我尝试这样做时 出现异常 ObjectDeletedException 已删除的对象将由级联重新保存 从关联中删除已删除的对象 我已经在谷歌上搜索了几个小时 但我找到的解决方案都不适合我
  • 在新文本文件中打印替换行

    我正在尝试编辑 matlabfile 并替换某些特定行中的一些编码部分 init 但是 使用下面的格式进行更改根本不会更改行上下文 它将打印相同的旧行 知道我做错了什么吗 replaceAll 不适合将行中的某些单词替换为其他单词 提前致谢
  • 参考 UWP 类库中的 ResourceDictionary

    我们有一个使用模板 10 的 UWP 应用 资源位于同一解决方案的 UWP 类库中 当我们运行应用程序时 我们收到错误 Windows UI Xaml Markup XamlParseException 无法从 ms resource Fi
  • 在 React 中的图表 js-2 的圆环图中添加文本

    i want to add a text message inside my doughnut pie chart To be more specific i want something like this 我在堆栈溢出中遇到了同样的问题
  • RecyclerView延迟加载(通用图像加载器)

    Using Android 通用图像加载器 https github com nostra13 Android Universal Image Loader和 RecyclerView 异步加载图像 我遇到了与其他人相同的错误 图像混合在一