【问题标题】:setImageResource() will not update my ImageView size/content directlysetImageResource() 不会直接更新我的 ImageView 大小/内容
【发布时间】:2020-05-03 13:59:28
【问题描述】:

我在listView活动中有一行,其中选择行时应更改图像。新图像与原始图像相同但更大(两倍大小)。再次取消选择时应该会减少(选择是使用我的内部选择实现的,而不是android键盘选择类型)。

问题是当(选择)我使用 setImageResource() 更改 ImageView () 的图片(绑定时)时,它不会在第一次单击时更新到我的列表行中的新更大版本。绑定的第二次执行工作正常。这同样适用于被取消选择的旧项目。在第二次单击之前,对较小图标的更改不会生效。每次我选择当前选择之外的另一行并在第二次单击时再次开始正常工作时,问题都会重复出现。

我已经通过代码并看到我将正确的 id 传递给 ImageView,事实证明,在同一行上显示黄色边框的另一个视图在选择/取消选择时更改为可见/隐藏。

对我来说,感觉 setImageResource() 不会立即刷新视图,但在视图或行上使用 invalidate() 根本没有效果。

这是一个错误(如何解决)还是我做错了什么?

代码:(来自我的持有人类,使用持有人模式 - 由适配器绑定方法执行)

@Override
public void refreshFromCursor(final Context context, final Cursor cursor) {
...
boolean selected = adapter.getSelectedPosition()==cursor.getPosition();
if (selected){
  selectedIndicator.setVisibility(View.VISIBLE); // Show a "selected" yellow border indicator to the left
} else {
  selectedIndicator.setVisibility(View.GONE); // Hide a "selected" yellow border indicator to the left
}
...
if (selected) completionResId = R.drawable.folder_selected;
else completionResId = R.drawable.folder;
...
statusIcon.setImageResource(completionResId); // !!!!! This is where I set the image that does not refresh/resize
...
}

还测试了交换

statusIcon.setImageResource(completionResId);

statusIcon.setImageDrawable(context.getResources().getDrawable(completionResId));

但问题行为没有任何改变

【问题讨论】:

  • 查看 Android 参考资料我发现:这会在 UI 线程上读取和解码位图,这可能会导致 延迟打嗝。如果这是一个问题,请考虑使用 setImageDrawable(android.graphics.drawable.Drawable) 或 setImageBitmap(android.graphics.Bitmap) 和 BitmapFactory。也许这可能是你的问题。你试过用setImageDrawable???
  • @Bruno 不,我还没有尝试过 setDrawable。需要重写一些代码才能做到这一点。我已阅读您从 javadoc 中引用的文本。但据我了解,这种“打嗝”应该会影响等待时间方面的性能,因为 GUI 线程被占用,但在更新图像方面不起作用。即使是这样的话,我怎么会强制ImageView直接更新!我很难相信 setImageResource() 方法在执行后不会更新 ImageView。这将使动态使用变得毫无价值。
  • 我完全同意你的观点,我也不理解这个问题。在我看来, setImageResource 应该可以正常工作,或者至少调用 invalidate 应该可以解决,但是您已经过测试。我没有测试使用 setImageDrawable,这只是一种尝试。也许它可以正常工作。
  • @Bruno 用 statusIcon.setImageDrawable(context.getResources().getDrawable(completionResId));完全相同的行为!更新了原始帖子。
  • :( 好吧,您可以尝试将 invalidateDrawable 方法与 setImageDrawable 一起使用,但我没有测试。抱歉,在适当的时候,我的工作场所的电脑中没有配置 Android。

标签: android android-layout


【解决方案1】:

在我看来,这与您实施的方式有关,

如果您向我们提供 refreshFromCursor(...) 函数的完整代码,我们可以更好地了解您所做的事情。

【讨论】:

    【解决方案2】:

    我发现了一个黑客。只是让你的drawable更大

    <vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="500dp"
    android:height="500dp"
    android:viewportWidth="139"
    android:viewportHeight="139">
    
    <path
        android:fillColor="#000000"
        android:pathData="M117.037,61.441L36.333,14.846c..." />
    </vector>
    

    在这里,我将可绘制对象设置为在 500dp 的画布上绘制(而不是原来的 139dp 画布),它成功了。不再有后来变大的怪异小图标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      相关资源
      最近更新 更多