带有自定义光标适配器的URL闪烁的图像

阿尔伯特·库兹敏

我正在查询SQLite数据库并将数据放入列表视图。数据库行之一包含图像Url字段(也可以是Uri)。

图像将按原样加载,但是一旦我滚动列表,所有图像就会开始闪烁,其中一些正在更改位置或显示在不同的位置。

我已经知道这种现象正在发生,因为列表视图正在重复使用滚动中的行,但是我不知道如何解决此问题。我也不能在该项目中使用像Picasso这样的外部库。

这是我的适配器代码:

    public class FilmsListCustomAdapter extends CursorAdapter {

    private LayoutInflater cursorInflater;

    public FilmsListCustomAdapter(Context context, Cursor c, int flags) {
        super(context, c, flags);
        cursorInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        TextView filmTitle = (TextView) view.findViewById(R.id.filmListTitle);
        TextView filmScore = (TextView) view.findViewById(R.id.filmListScore);
        ImageView filmImage = (ImageView)view.findViewById(R.id.filmListPoster);
        ImageView filmSeen = (ImageView)view.findViewById(R.id.filmListSeen);

        String title = cursor.getString( cursor.getColumnIndex("title") );
        String score = cursor.getString(cursor.getColumnIndex("score"));
        String url = cursor.getString( cursor.getColumnIndex("url") );
        int seen = cursor.getInt( cursor.getColumnIndex("seen") );

        if(Patterns.WEB_URL.matcher(url).matches()){
            LoadImage loadImage = new LoadImage(context,filmImage);
            loadImage.execute(url);
        }
        else{
            Bitmap bmp = BitmapFactory.decodeFile(url);
            CamImage camImage = new CamImage(context,Uri.parse(url));
            Bitmap rotetedIm = camImage.rotateCamImage(bmp,url);
            if(rotetedIm!=null){filmImage.setImageBitmap(Bitmap.createScaledBitmap(rotetedIm, 850, rotetedIm.getHeight(), false));}
            else{filmImage.setImageResource(R.drawable.no_poster);}
        }

        GlobalMethods methods = new GlobalMethods(context);
        filmTitle.setTypeface(methods.getWalkFont());
        filmTitle.setText(title);
        filmScore.setText(score);
        if(seen==1){filmSeen.setImageResource(R.drawable.eye);}
        else{filmSeen.setImageResource(0);}
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
        return cursorInflater.inflate(R.layout.film_row, viewGroup, false);
    }
}
克里斯·拉尔森

可能是这样的:

  • 您会获得图片的网络网址,并排队将其AsyncTask下载到ImageView

  • 您滚动并ImageView回收

  • 这次ImageView获取本地URL,因此您可以立即执行此操作

  • 先前排队AsyncTask的图像会完成并在您刚刚放入的图像上加载现在不相关的图像

清除此错误的关键是确保在ImageView回收任务后立即取消该任务一种方法是AsyncTask在的标记中放置对的引用ImageView回收后ImageView,您可以检查标签并查看是否有正在进行的任务,并在开始新任务之前将其取消。

您应该在Android Developers Blog上查看这篇文章,它将进一步说明该问题及其解决方法:

多线程性能| Android开发者博客

我认为这篇文章是在将AsyncTasks更改为在并行线程中运行时写的,因为它们谈论的任务是无序完成的。从那以后,它们已恢复为串行执行,因此我认为该部分不再适用,但是概念很相似,因为您立即加载本地映像的操作就像是乱序执行的任务。

我会考虑另外两件事:

  • 进入时getView,始终imageView.setImageBitmap(null)首先调用以清除回收的任何残留图像ImageView我喜欢用ImageView一个非常中性的灰色位图来表示“图像加载”状态。

  • 使用AsyncTask解码本地文件以及检索网络文件。我敢打赌,当您执行此操作时,列表滚动看起来会更加流畅。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

android:带有自定义适配器的AutoCompleteTextView

来自分类Dev

自定义适配器视图(带有图片)

来自分类Dev

android:带有自定义适配器的AutoCompleteTextView

来自分类Dev

自定义光标适配器(获取位置)

来自分类Dev

Android Studio中带有自定义适配器的自定义ListView

来自分类Dev

在用于ListView的自定义适配器中从URL加载图像(Android Studio)

来自分类Dev

来自URL的图像未加载到自定义适配器中

来自分类Dev

毕加索未使用自定义适配器从url加载图像

来自分类Dev

带有自定义适配器的字符串数组

来自分类Dev

带有自定义适配器的导航抽屉无法正确反应

来自分类Dev

为什么onStopTrackingTouch不能在带有seekbar的自定义适配器中工作?

来自分类Dev

带有片段中的自定义适配器的ListView

来自分类Dev

带有自定义适配器的ListView不会出现

来自分类Dev

带有自定义适配器的alertdialog listview不显示任何内容

来自分类Dev

带有自定义适配器的 Android ListView 仅显示最后一项

来自分类Dev

带有对齐特定行的自定义适配器的 Android ListView

来自分类Dev

Android:具有图像和文本错误的自定义网格视图适配器

来自分类Dev

具有自定义适配器的Listview图像和文本

来自分类Dev

Android:具有图像和文本错误的自定义网格视图适配器

来自分类Dev

具有图像和文本的自定义适配器

来自分类Dev

具有基本适配器列表项的自定义适配器重复

来自分类Dev

使用带有参数的自定义绑定适配器侦听器方法的Android自定义视图

来自分类Dev

具有自定义光标适配器和多个视图的android listview-仅对bindView特定视图

来自分类Dev

自定义适配器的问题

来自分类Dev

ListView的自定义适配器

来自分类Dev

自定义ListView的适配器

来自分类Dev

删除数据库行后刷新自定义光标适配器

来自分类Dev

运行时自定义光标适配器错误,非法参数异常

来自分类Dev

如何在自定义光标适配器中保留edittext值

Related 相关文章

  1. 1

    android:带有自定义适配器的AutoCompleteTextView

  2. 2

    自定义适配器视图(带有图片)

  3. 3

    android:带有自定义适配器的AutoCompleteTextView

  4. 4

    自定义光标适配器(获取位置)

  5. 5

    Android Studio中带有自定义适配器的自定义ListView

  6. 6

    在用于ListView的自定义适配器中从URL加载图像(Android Studio)

  7. 7

    来自URL的图像未加载到自定义适配器中

  8. 8

    毕加索未使用自定义适配器从url加载图像

  9. 9

    带有自定义适配器的字符串数组

  10. 10

    带有自定义适配器的导航抽屉无法正确反应

  11. 11

    为什么onStopTrackingTouch不能在带有seekbar的自定义适配器中工作?

  12. 12

    带有片段中的自定义适配器的ListView

  13. 13

    带有自定义适配器的ListView不会出现

  14. 14

    带有自定义适配器的alertdialog listview不显示任何内容

  15. 15

    带有自定义适配器的 Android ListView 仅显示最后一项

  16. 16

    带有对齐特定行的自定义适配器的 Android ListView

  17. 17

    Android:具有图像和文本错误的自定义网格视图适配器

  18. 18

    具有自定义适配器的Listview图像和文本

  19. 19

    Android:具有图像和文本错误的自定义网格视图适配器

  20. 20

    具有图像和文本的自定义适配器

  21. 21

    具有基本适配器列表项的自定义适配器重复

  22. 22

    使用带有参数的自定义绑定适配器侦听器方法的Android自定义视图

  23. 23

    具有自定义光标适配器和多个视图的android listview-仅对bindView特定视图

  24. 24

    自定义适配器的问题

  25. 25

    ListView的自定义适配器

  26. 26

    自定义ListView的适配器

  27. 27

    删除数据库行后刷新自定义光标适配器

  28. 28

    运行时自定义光标适配器错误,非法参数异常

  29. 29

    如何在自定义光标适配器中保留edittext值

热门标签

归档