微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用ASyncTask更新自定义ListView中的ImageView?

如何解决如何使用ASyncTask更新自定义ListView中的ImageView?

| 我知道已经有成千上万的类似问题,但是我检查了20多个答案,但没有一个解决我的问题。 首先,我有一个扩展
SimpleCursorAdapter
的适配器。我在其中使用自定义视图,包括
ImageView
。布局为:
<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"
android:orientation=\"horizontal\" android:layout_width=\"fill_parent\"
android:layout_height=\"@dimen/listitem_height\" android:gravity=\"center_vertical\">
<ImageView android:id=\"@+id/row_image\" android:layout_width=\"@dimen/listitem_height\"
    android:layout_height=\"fill_parent\" android:paddingRight=\"@dimen/spaceLarge\"
    android:layout_centerVertical=\"true\" android:layout_marginLeft=\"@dimen/spaceMedium\"
    android:src=\"@drawable/unkNown_album\" />
<LinearLayout android:layout_width=\"fill_parent\"
    android:layout_height=\"fill_parent\" android:orientation=\"vertical\"
    android:gravity=\"center_vertical|left\">
    <TextView android:id=\"@+id/row_text\" android:layout_width=\"fill_parent\"
        android:textAppearance=\"?android:attr/textAppearanceMedium\"
        android:gravity=\"center_vertical|left\" android:layout_height=\"wrap_content\" />
    <TextView android:id=\"@+id/title\" android:layout_width=\"fill_parent\"
        android:textAppearance=\"?android:attr/textAppearanceSmall\"
        android:gravity=\"center_vertical|left\" android:layout_height=\"wrap_content\"
        android:textColor=\"#95D0B4\" />
</LinearLayout>
然后,ѭ1需要一些时间来加载图像,所以如果我在主线程中进行加载,滚动将变得很糟糕。因此,我想使用“ 4”来加载图像,但是现在我遇到了“ 5”的问题,该问题在滚动时会重用视图。 也就是说,以下代码不起作用:
class imagesetter extends AsyncTask<String,Void,Bitmap> {

    private ImageView iv;

    imagesetter(ImageView iv) {
        this.iv = iv;
    }

    @Override
    protected Bitmap doInBackground(String... params) {
        String path = (String) params[0];
        try {
            return BitmapFactory.decodeFile(path);
        } catch (OutOfMemoryError e) {
            Log.w(Utils.TAG,\"\",e);
            return null;
        }
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        iv.setimageBitmap(result);
        super.onPostExecute(result);
    }

}
我在适配器的
bindView()
中称
execute()
。滚动时ѭ1改变,结果位图被设置到错误的位置。 有人解决这个问题吗?非常感谢你! 附言快速滚动列表时,我也会遇到严重的“ 10”问题。我完全不知道如何避免位图内存泄漏问题,因为只要它们在列表中,我就无法回收它们。     

解决方法

        适配器重用ListView内的视图。结果你永远不确定
private ImageView iv;
包含您要设置的ImageView对象。您应使用ID在列表中查找适当的单元格。 重新考虑使用缩略图或减小图像尺寸。你可以在这里阅读更多: 延迟加载ListView中的图像     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。