【发布时间】: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。