当前位置: 首页 > 面试题库 >

Listview显示错误的图像

王声
2023-03-14
问题内容

我有一个带有ArrayAdapter的ListView,其中包含带有图像和字符串的行。直到我确定图像的加载速度变慢,这样我才能在显示列表之前无法加载图像,这样效果很好。因此,我开始使用加载图像到单独的线程中AsyncTask。

在开始滚动列表之前,我对结果感到非常满意。加载了错误的图像,看起来好像不是图像稍后出现的问题。如果我尝试对列表进行排序,问题将变得非常严重,并且没有图像在右行。

关于我在做什么错的任何想法?

public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        ImageView imageView;
        TextView textView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.drink_list_row, null);
        }

        Drink drink = allItems.get(position);
        if (drink != null && v != null) {
            imageView = (ImageView) v.findViewById(R.id.picture);
            textView = (TextView) v.findViewById(R.id.drinkName);
            imageView.setVisibility(View.GONE);
            loadImageBitmap(drink, imageView);
            textView.setText(drink.getName());

            if (subItems != null && subItems.contains(drink)) {
                textView.setVisibility(View.VISIBLE);
                imageView.setVisibility(View.VISIBLE);
            } else {
                textView.setVisibility(View.GONE);
                imageView.setVisibility(View.GONE);
            }
        }
        return v;
    }

问题答案:

问题来自于您的convertView:它是整个列表中使用的同一实例,因此,当异步加载完成时,当listview尝试使用相同的convertView绘制其他项目时,图像会更改(或在这种情况下) ,其子imageView)。

painting position 1, uses placeholder, starts loading image 1 asynchronously
painting position 2, uses placeholder, starts loading image 2 asynchronously
image 1 loading is complete, calling setImageBitmap on imageView
painting position 3, uses image 1, starts loading image 3 asynchronously
etc.

但是,您可以做的是在listadapter中保留位图缓存。像这样:

private Bitmap[] bitmapList;
private Bitmap bitmapPlaceholder;  

private void initBitmapListWithPlaceholders(){ 
// call this whenever the list size changes
// you can also use a list or a map or whatever so you 
// don't need to drop all the previously loaded bitmap whenever 
// the list contents are modified
    int count = getListCount();
    bitmapList = new Bitmap[count];
    for(int i=0;i<count;i++){
         bitmapList[i]=bitmapPlaceholder
    }
}

private void onBitmapLoaded(int position, Bitmap bmp){
// this is your callback when the load async is done
    bitmapList[position] = bmp;
}

public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    ImageView imageView;
    TextView textView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.drink_list_row, null);
    }

    Drink drink = allItems.get(position);
    if (drink != null && v != null) {
        imageView = (ImageView) v.findViewById(R.id.picture);
        textView = (TextView) v.findViewById(R.id.drinkName);
        imageView.setVisibility(View.GONE);
        imageView.setImageBitmap(bitmapList[position]);
        loadImageBitmap(drink, position); // this should call onBitmapLoaded(int position, Bitmap bmp) when finished to update the bitmapList and replace the placeholder
        textView.setText(drink.getName());

        if (subItems != null && subItems.contains(drink)) {
            textView.setVisibility(View.VISIBLE);
            imageView.setVisibility(View.VISIBLE);
        } else {
            textView.setVisibility(View.GONE);
            imageView.setVisibility(View.GONE);
        }
    }
    return v;
}


 类似资料:
  • 我有自定义列表视图。在listview中包含200个项目。当我从上到下或从下到上快速滚动时,listview显示错误的图像。如果我在慢慢滚动,那么它的工作很好。 XML格式的SimpleDraweeView: 将图像URI设置为SimpleDraweeView: SetHierarchyForDraweeView函数: AsyncColorDrawable类: 如果我做错了什么,请你想清楚。谢谢你

  • 它将我带到图库以选择图像,但未显示在应用程序中,当单击上传按钮时,它只是一个空白图像视图 < li >我的Java代码 < li>XML代码 运行时显示此错误 java.lang.IllegalArgumentException:uri不能为空 以下两处给出错误的行显示了uri错误

  • 我试图在应用程序启动时显示项目的listview。但在应用程序启动时,没有显示listview,只有一个空白屏幕。下面是代码: MainActivity.java 但是现在我在logcat中得到了以下内容: 并且应用程序停止..请帮助!

  • 我在WatchKit中看到一个bug,当通过编程或从情节提要中指定名称时,它会显示错误的图像。我做错什么了吗? 使用名称和 将第一个图像设置为界面图像: 显示第一个图像。 第二张图片。 6.2版(6C131e) https://github.com/evgenyneu/watch-image-glitch-demo 这个bug已经提交给Apple Bug记者,Apple确认这是一个bug。

  • 单击标准容器(弹出窗口)后,它不会打开“创建容器”(弹出窗口)窗口。 手动地,所有功能都正常工作,但是SeleniumIDE抛出错误“找不到映像”

  • 我已经在Android studio上安装了颤振,每当我在Android studio上导入新项目时,它会显示“Dart未配置下载Dart SDK或打开Dart设置” 到目前为止,代码还不错。 当我打开省道设置时 Idk在每个项目中尝试了什么,只有在新的颤振项目运行良好时才尝试。颤振版本是2.8.1 Dart版本是2.15.1 Android Studio Arctic Fox | 2020.3.