我在我的应用程序中使用菜单,其中所有菜单项都存储在列表中。当调用方法getView时,我指定项目名称和图标。对于图标我使用StateListDrawable(但我也试过简单的颜色drawable)。问题是,每当我尝试滚动菜单并调用getView时,我的整个列表都会消失。我把它的原因归结为图像视图方法setImageDrawable();如果我发表评论,一切正常。在另一个线程上调用此方法,因为我首先需要下载图像。如果我将setImageDrawable()代码直接移动到getView方法,它将加载所有内容并且菜单不会消失,但是在下载图像并且菜单可用之前,延迟时间太长。
有效的代码:
icon.setVisibility(View.INVISIBLE);
icon.setImageDrawable(new ColorDrawable(Color.CYAN));
icon.setVisibility(View.VISIBLE);
使菜单消失的代码。
context.getNetworkManager().execute(new ImageRunnable() {
boolean success = true;
@Override
public void run(Bitmap image) {
if (image == null) {
success = false;
}
final Bitmap selectedImage = image;
context.getNetworkManager().execute(new ImageRunnable() {
@Override
public void run(Bitmap image) {
if (image == null) {
success = false;
}
if (success) {
StateListDrawable icons = new StateListDrawable();
icons.addState(new int[] {android.R.attr.state_pressed},
new BitmapDrawable(context.getResources(), selectedImage));
icons.addState(new int[] {android.R.attr.state_selected},
new BitmapDrawable(context.getResources(), selectedImage));
icons.addState(new int[] {-android.R.attr.state_selected},
new BitmapDrawable(context.getResources(), image));
icon.setImageDrawable(icons);
//icon.setImageDrawable(new ColorDrawable(Color.CYAN));
icon.setVisibility(View.VISIBLE);
}
}
});
}
});
任何想法如何解决这个问题?这种情况发生在模拟器和Galaxy SII上,但不适用于Galaxy SIII。
答案 0 :(得分:0)
Android不允许您从非UI线程修改UI组件。换句话说,您无法从线程的icon.setVisibility(View.VISIBLE);
方法调用run()
。我的假设是,这正是ImageRunnable
中发生的事情。
检查LogCat是否有任何异常消息。
也许您可以提取在适配器的构造函数中初始化StateListDrawable
的代码部分,因此只调用一次,然后在getView()
中设置图像drawable而不使用线程