Volley的NetworkImageView中的模糊图像

时间:2014-03-15 21:48:20

标签: android android-volley

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

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

当项目视图在适配器中被回收时,会出现问题。如果我没有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; } 的定义:

ArrayAdapter

注意:

  • 适配器是基于here的自定义适配器。我也尝试了正常的mAdapter.removeAt(position);,同样的问题也出现了。我真的怀疑这个问题与适配器有关。
  • 我还尝试StableArrayAdapter作为库来实现滑动删除功能。出现完全相同的问题。这就是让我相信这个错误与Volley有关而不是刷卡库的原因。
  • 简单地调用ImageView而不使用滑动删除库可以完美无缺地工作。
  • 使用NetworkImageViewandroid-swipelistview加载图片可以毫无问题地工作。
  • 我使用应用程序上下文将Volley用作Singleton。

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

1 个答案:

答案 0 :(得分:2)

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

android:adjustViewBounds="true"

将其替换为下面的行解决它:

android:scaleType="centerCrop"

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