Android在 ListView 中加载图片

标签 android imageview

在我的 Android 应用程序中,Asyntask 用于在 ListView 中从 Web 加载图像。我想显示图像的中心部分,并且我尝试过使用 imageloader 来加载图像,但问题是图像清晰度很差,但我已使用它来加载缩略图,因为缩略图非常小。所以我尝试了下面给出的 Asyntask。此方法的问题是 ImageView 显示其他图像,这意味着第一个列表项中的 ImageView 将显示下一个列表项的图像一段时间后它会显示正确的图像。我该如何解决这个问题。或者建议一种清晰地加载图像的方法。请帮助我。提前致谢

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    ImageView bmImage;
    ProgressBar mProgressBar;
    String url;

    public DownloadImageTask(ImageView bmImage, ProgressBar progressBar) {
        this.bmImage = bmImage;
        this.mProgressBar = progressBar;
    }

    @Override
    protected void onPreExecute() {
        mProgressBar.setVisibility(View.VISIBLE);
        super.onPreExecute();
    }

    protected Bitmap doInBackground(String... urls) {
        String urldisplay = urls[0];
        url = urldisplay;
        Bitmap mIcon11 = null;
        try {
            InputStream in = new java.net.URL(urldisplay).openStream();
            mIcon11 = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            // Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return mIcon11;
    }

    protected void onPostExecute(Bitmap result) {
        Utilities.addBitmapToMemoryCache(url, result);
        bmImage.setImageBitmap(result);
        mProgressBar.setVisibility(View.GONE);
        // result.recycle();
    }
}

}

public View getView(final int position, View convertView, ViewGroup parent) {
    vi = convertView;
    int type = getItemViewType(position);
    // Utilities.message_player = new MediaPlayer();
    if (vi == null) {
        inflater = LayoutInflater.from(mcontext);
        if (type == ITEM_TYPE_ONE)
            vi = inflater.inflate(R.layout.message_group_list_item, null);
        else
            vi = inflater.inflate(R.layout.listlastrow, null);
    }
    if (type == ITEM_TYPE_ONE) {
        if (fontType == true) {

        }
        ((ImageView) vi.findViewById(R.id.imageMessage)).setTag(position+"i");

Bitmap bmp = Utilities.getBitmapFromMemCache(feedsImage);
                    if(bmp == null){
                    DownloadImageTask dwnloadImgTask = new DownloadImageTask(((ImageView) vi.findViewWithTag(position+"i")),
                            ((ProgressBar) vi.findViewById(R.id.progressBar1)));
                    dwnloadImgTask.execute(feedsImage);
                    }else{
                        ((ImageView) vi.findViewById(R.id.imageMessage)).setImageBitmap(bmp);
                    }

}
}

最佳答案

当您从缓存设置位图或下载新图像时,您会丢失一些内容:

您的父 View (vi) 可能是先前创建的 View ,已被回收以避免重新创建每个 View (这就是 convertView 的用途)。

此convertView上已经有一个图像,因为它是一个已加载图像的回收项目。

所以如果你有一个convertView,你必须重置 ImageView 内容:

    ((ImageView) vi.findViewById(R.id.imageMessage)).setTag(position+"i");

    Bitmap bmp = Utilities.getBitmapFromMemCache(feedsImage);
    if(bmp == null){
        //HERE I add a line to reset the bitmap of the imageview
        ((ImageView) vi.findViewById(R.id.imageMessage)).setImageBitmap(null);

        DownloadImageTask dwnloadImgTask = new DownloadImageTask(((ImageView)    vi.findViewWithTag(position+"i")), ((ProgressBar) vi.findViewById(R.id.progressBar1)));
        dwnloadImgTask.execute(feedsImage);
    }else{
        ((ImageView) vi.findViewById(R.id.imageMessage)).setImageBitmap(bmp);
    }

我已设置 null 来删除位图,但您可能想要设置一个占位符位图(例如带有重新加载图标的灰色图片或类似的东西...)

希望有帮助。

关于Android在 ListView 中加载图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17719884/

相关文章:

android - osmbonuspack 中道路距离和持续时间的单位

java - 对焦后Android相机拍照失败

android - 如何正确学习Android测试?

Android ImageView - setAlpha(float) 与 setImageAlpha(int)

JavaFX-获取一个 ImageView 的图像并将其分配给另一个 ImageView

java - 如何通过 com.android.volley.Request 发送数组类型参数

javascript - 使用 React Navigators 嵌套导航器 - 'Home' 应该声明一个屏幕

android - 如何使图像适合android中的圆形框架

android - 如何根据 ImageView 的内容大小将 View 放在 ImageView 之上?

cocoa-touch - 使用 UIImage 从 URL 异步加载图像时出现明显延迟