Volley的NetworkImageView显示模糊的图片

3
我有一个包含NetworkImageView的项目列表,并且我遇到了一个奇怪的bug。我想使用滑动手势删除列表项,所以我正在使用EnhancedListView库。问题是,当我使用滑动手势删除列表中的项目时,NetworkImageView中的图像会变模糊。
在项目移除之前的列表截图可以在这里找到,在使用滑动手势删除第一个元素后的列表截图可以在这里找到。
问题出现在适配器中视图被回收利用的时候。如果我不使用ViewHolder并在getView(int position, View convertView, ViewGroup parent)中每次都重新填充布局,则不会出现此问题(尽管在这种情况下,列表在项目删除后会闪烁)。
以下是设置使用滑动手势删除元素的片段中的代码:
mListView.setDismissCallback(new de.timroes.android.listview.EnhancedListView.OnDismissCallback() {
    @Override
    public EnhancedListView.Undoable onDismiss(EnhancedListView listView, final int position) {
        final Cafe cafe = mAdapter.getItem(position);
        mAdapter.removeAt(position);
        return new EnhancedListView.Undoable() {
            /**
             * This method is called if undo button is pressed
             */
            @Override
            public void undo() {
                mAdapter.insertAt(position, cafe);
            }

            /**
             * Returns the text in the Toast next to "Undo"
             * @return text
             */
            @Override public String getTitle() {
                return getString(R.string.removed_from_favorites);
            }

            /**
             * This method is called after the undo text has been discarded.
             * It must remove the favorite in the model.
             */
            @Override public void discard() {
                CafeHelper.getInstance().toggleCafeStarredStatus(cafe.getId());
            }
        };
    }
});

mListView.enableSwipeToDismiss();
mListView.setSwipeDirection(EnhancedListView.SwipeDirection.START);

你可以看到,滑动手势只是调用了 mAdapter.removeAt(position);。以下是适配器中 getView(int position, View convertView, ViewGroup parent) 方法的代码以及 ViewHolder 的定义:
static class ViewHolder {
    TextView name;
    NetworkImageView image;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder = null;
    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater
                .inflate(R.layout.fragment_starred_cafe_list_item, null);

        viewHolder = new ViewHolder();
        viewHolder.name = (TextView) convertView
                .findViewById(R.id.starred_cafe_list_item_name);
        viewHolder.image = (NetworkImageView) convertView
                .findViewById(R.id.starred_cafe_list_item_image);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
        viewHolder.image.setImageUrl(null, VolleySingleton.getInstance().getImageLoader());
    }
    Cafe cafe = getItem(position);

    viewHolder.name.setText(cafe.getName());
    viewHolder.image.setImageUrl(cafe.getThumbUrl(), VolleySingleton.getInstance().getImageLoader());

    return convertView;
}

注:

  • 此适配器是基于StableArrayAdapter的自定义适配器。我还尝试使用普通的ArrayAdapter,但问题仍然存在。我真的怀疑这个问题与适配器有关。
  • 我还尝试了android-swipelistview作为实现滑动删除功能的库。完全相同的问题出现了。这就让我相信这个错误与Volley有关,而不是与滑动库有关。
  • 仅仅调用mAdapter.removeAt(position);而不使用滑动删除库可以完美地工作。
  • 使用带有PicassoImageView来加载图像也没有任何问题。
  • 我正在使用Application上下文将Volley作为单例使用。

在深入研究Volley的代码后,似乎问题可能与获取NetworkImageView的宽度和高度有关,但我还没有时间调试该库。如果有深刻了解Volley的人可以帮助找出问题并提供解决方案,欢迎回答。


我也遇到了同样的问题。我在NetworkImageView中使用矢量图作为默认图像,但经常会显示模糊。单击后才变得清晰。 - gpl
1个回答

2

我曾经遇到过相同的问题,加载的图片模糊不清,我认为是由于布局属性引起的:

android:adjustViewBounds="true"

通过使用下面的代码行进行替换,问题得到解决:
android:scaleType="centerCrop"

我认为你是正确的,Volley只能获取原始图像的宽度,并且不能获取任何调整后的宽度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接