【问题标题】:Blurry images in Volley's NetworkImageViewVolley 的 NetworkImageView 中的模糊图像
【发布时间】:2014-03-15 21:48:20
【问题描述】:

我有一个包含NetworkImageView 的项目列表,我遇到了一个奇怪的错误。我希望能够使用滑动手势删除列表项,所以我使用EnhancedListView 库。问题是当我使用滑动手势删除列表中的项目时,NetworkImageView 中的图像变得模糊。

可以找到删除项目之前的列表屏幕截图here,可以找到使用滑动手势删除第一个元素后的列表屏幕截图here。

当项目的视图在适配器中被回收时,就会出现问题。如果我不使用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); 而无需使用滑动即可删除库即可完美运行。
  • 使用ImageView 和Picasso 加载图像没有任何问题。
  • 我使用应用程序上下文将 Volley 作为 Singleton 使用。

在挖掘Volley的代码后,似乎问题可能与获取NetworkImageView的宽度和高度有关,但我没有时间调试库。如果对 Volley 有深入了解的人可以帮助查明问题并找到解决方案,欢迎您的回答。

【问题讨论】:

    标签: android android-volley


    【解决方案1】:

    我有同样的问题,加载的图像模糊,我认为这是由布局属性引起的:

    android:adjustViewBounds="true"
    

    通过用下面的行替换它解决了它:

    android:scaleType="centerCrop"
    

    我认为你是对的,Volley 只能得到图像的原始宽度,而不是经过某种调整后的宽度

    【讨论】:

      猜你喜欢
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多