使用 AsyncTask 将图像加载到自定义适配器中

2023-11-23

尽管有很多教程,但我发现实现 AsyncTask 将图像从 URI(从内容提供程序获取)加载到自定义适配器中确实很困难。

我得到了基本要点,即有一个包含 AsyncTask 的类,在“doInBackground”中创建位图,然后在 onPostExecute 中设置 ImageView。

对于我来说,作为 Android 和编程新手,问题是我不知道如何将我的 Uri 传递给每个项目的 AsyncTask、如何创建位图以及如何将其返回到适配器。

我对实际的 AsyncTask 类(ImageLoader)只了解了这么多:

package another.music.player;

import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.widget.ImageView;

public class ImageLoader extends AsyncTask<String, String, Bitmap> {

    private ImageView imageView;
    private Bitmap bitmap = null;

    @Override
    protected Bitmap doInBackground(String... uri) {

        // Create bitmap from passed in Uri here

        return bitmap;

    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (bitmap != null && imageView != null) {
            imageView.setImageBitmap(bitmap);

        }
    }
}

我的自定义适配器如下所示:

package another.music.player;

import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.BaseColumns;
import android.provider.MediaStore.Audio.AlbumColumns;
import android.provider.MediaStore.Audio.AudioColumns;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.ImageView;
import android.widget.TextView;

class AlbumAdapter extends CursorAdapter {

    public AlbumAdapter(Context context, Cursor c, int flags) {
        super(context, c, flags);
    }

    private static Uri currentSongUri;

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        ImageView albumArt = (ImageView) view.getTag(R.id.albumArt);
        TextView text1 = (TextView) view.getTag(R.id.artistTitle);
        TextView text2 = (TextView) view.getTag(R.id.albumTitle);
        TextView text3 = (TextView) view.getTag(R.id.totalSongs);

        albumArt.setImageBitmap(null);

        text1.setText(cursor.getString(cursor
                .getColumnIndex(AudioColumns.ARTIST)));
        text2.setText(cursor.getString(cursor
                .getColumnIndex(AudioColumns.ALBUM)));
        text3.setText(cursor.getString(cursor
                .getColumnIndex(AlbumColumns.NUMBER_OF_SONGS)));

        String currentAlbumId = cursor.getString(cursor
                .getColumnIndex(BaseColumns._ID));

        Integer currentAlbumIdLong = Integer.parseInt(currentAlbumId);
        Uri artworkUri = Uri.parse("content://media/external/audio/albumart");
        currentSongUri = ContentUris.withAppendedId(artworkUri,
                currentAlbumIdLong);

        //Run ImageLoader AsyncTask here, and somehow retrieve the ImageView & set it.

    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.albumitem, null);
        view.setTag(R.id.albumArt, view.findViewById(R.id.albumArt));
        view.setTag(R.id.artistTitle, view.findViewById(R.id.artistTitle));
        view.setTag(R.id.albumTitle, view.findViewById(R.id.albumTitle));
        view.setTag(R.id.totalSongs, view.findViewById(R.id.totalSongs));

        return view;
    }

}

如果有人能告诉我如何继续进行此操作,我将非常感激。

Thanks.


您需要通过您的AsyncTask视图以便在完成时可以更新它:

//Run ImageLoader AsyncTask here, and let it set the ImageView when it is done.
new ImageLoader().execute(view, uri);

并修改AsyncTask这样它就可以处理混合参数类型:

public class ImageLoader extends AsyncTask<Object, String, Bitmap> {

    private View view;
    private Bitmap bitmap = null;

    @Override
    protected Bitmap doInBackground(Object... parameters) {

        // Get the passed arguments here
        view = (View) parameters[0];
        String uri = (String)parameters[1];

        // Create bitmap from passed in Uri here
        // ...
        return bitmap;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (bitmap != null && view != null) {
            ImageView albumArt = (ImageView) view.getTag(R.id.albumArt);
            albumArt.setImageBitmap(bitmap);
        }
    }
}

我还没有测试过这段代码,但它应该可以给你一个想法。

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

使用 AsyncTask 将图像加载到自定义适配器中 的相关文章

随机推荐

  • Linux 中的优雅关闭服务器套接字

    我希望能够停止侦听 Linux 中的服务器套接字 并确保从客户端角度打开的所有连接都得到正确处理并且不会突然关闭 即 接收 ECONNRESET ie sock create socket listen sock non zero back
  • 使用 jquery contains 更改 div 中文本的颜色

    这里 div 内的整个文本都变成红色 但我只需要改变 bar 字的颜色
  • 在 WooCommerce 中以编程方式创建可变产品和两个新属性

    我想以编程方式创建一个具有两个新变量属性的变量产品 父 产品 所有这些属性都来自 WordPress 插件 因此没有对 API 的 HTTP 请求 这两个变量属性也应该动态创建 如何才能做到这一点 使用 WooCommerce 版本 3 更
  • 如何获取SceneKit中子节点旋转后的真实位置?

    我正在使用 SceneKit 开发一个场景 我有一个带有子节点的主节点 Main node SCNNode planet SCNNode node planet geometry SCNSphere sphereWithRadius 2 p
  • C# 中如何检查两个字符串是否部分匹配? [复制]

    这个问题在这里已经有答案了 可能的重复 是否有为 C 编写的模糊搜索或字符串相似性函数库 我正在创建一个应用程序 它将排除用户输入的歌曲或艺术家或专辑名称 然后将查找字符串数组或数组列表以查找任何可能的匹配项 自动建议将根据匹配百分比计算
  • iOS 如何在没有堆栈跟踪的情况下调试崩溃,例如: [__NSArrayM objectAtIndex:]: 索引 0 超出空数组的范围?

    我试图关闭模态视图控制器并收到以下错误 由于未捕获的异常 NSRangeException 而终止应用程序 原因 NSArrayM objectAtIndex 索引 0 超出空数组的范围 有一次我花了 4 个小时尝试调试这样的错误 谁能告诉
  • JVM 如何知道运行时在哪里捕获异常?

    据我了解 throw是一个原始的 jvm 命令 当调用它时 JVM 检查当前调用堆栈是否可以捕获它 如果不能 那么 java 只是弹出调用堆栈 几乎就像调用 return 一样 然后jvm 检查当前调用堆栈是否可以捕获它 递归地依此类推 我
  • os.exec* 的第一个参数

    来自 python 文档 各种 exec 函数采用 新程序的参数列表 加载到进程中 在每种情况下 这些参数中的第一个被传递 将新程序作为自己的名称 而不是作为用户可能的参数 已在命令行中输入 为了 C程序员 这是argv 0 传递给程序的
  • .NET WebApi 身份验证

    目前 我有一个销售小部件的 MVC Web 应用程序 用户使用表单身份验证登录我们的系统 然后可以根据他们所属的组执行各种功能 即下订单 查看订单 取消订单等 我们的任务是编写一个 API 让第三方能够在我们的系统中创建和查看订单 每个第三
  • 如何在 Django 中为外键字段定义 __str__ 方法?

    我如何定义strDjango 中外键字段的方法 下面的代码不起作用 class A models Model name models ForeignKey B def str self return self name 如果你的型号B ha
  • Struts 1.x 与 Struts 2.x

    我已经回顾了一些关于 SO 的 Struts 1 vs 2 问题 但似乎没有一个能从我正在看待的角度回答这个问题 我即将开始构建一个新系统 对一个非常旧的桌面应用程序进行彻底的重新设计 目标是使其基于网络 添加更多功能 使其更可用等 通常的
  • 计算 QR 码对齐图案的位置

    我需要知道如何计算 QR 码对齐图案的位置 如中定义ISO IEC 18004 2000 附录 E 表 我不明白它是如何计算的 例如 如果您采用版本 16 则使用 6 26 50 74 计算位置 点之间的距离为 20 24 24 如果点之间
  • 如何制作自解压并运行安装程序

    因此 目前我的用户下载一个 zip 文件 将其解压缩 然后运行 setup exe 我希望他们只需单击一下即可完成此操作 使用http www wikihow com Use 7Zip to Create Self Extracting e
  • Android Marshmallow“无法播放此视频”错误

    我正在将应用程序升级到 android 6 0 一切似乎都很好 除了尝试从远程源播放某些视频时除外 它们在我们的非 Marshmallow 设备上播放得很好 具体来说 我有一台运行 4 1 2 Jelly Bean 的 Galaxy S3
  • 通过键连接两个地图

    我有两张地图 Map
  • 将字符串转换为 BASE62

    我正在寻找将字符串转换为 BASE62 的 C 代码 如下所示 http www molengo com base62 title base62 encoder decoder 我需要那些用于 URL 编码的编码和解码方法 BINARY 到
  • SqlParameter 不允许表名 - 其他选项没有 sql 注入攻击?

    我收到运行时错误说 Must declare the table variable parmTableName 这意味着不允许在 sql 语句中将表名作为 sql 参数 是否有比允许 sql 注入攻击更好的选择或建议 我不想为 sql 语句
  • 圆形进度条背景:Android Xamarin

    我有一个圆形进度条 它工作正常 但是背景没有出现 即使我在 xml 可绘制文件中给出了 背景 的形状 并且进度从圆圈的右侧开始 如图所示 我希望它能从顶部开始 这是我的代码
  • 提取不带扩展名 R 的 csv 文件名

    我有一个包含不同文件的文件夹 我想做的是仅提取不带扩展名的 csv 文件的文件名 例如 如果我有一个包含文件的文件夹 cp1 csv cp2 csv sd exe 我想得到一个向量 cp1 cp2 你可以使用list files gsub
  • 使用 AsyncTask 将图像加载到自定义适配器中

    尽管有很多教程 但我发现实现 AsyncTask 将图像从 URI 从内容提供程序获取 加载到自定义适配器中确实很困难 我得到了基本要点 即有一个包含 AsyncTask 的类 在 doInBackground 中创建位图 然后在 onPo