0

我在我的应用程序中使用菜单,其中所有菜单项都存储在列表中。当调用 getView 方法时,我指定项目名称和图标。对于图标,我使用 StateListDrawable(但我也尝试使用简单的颜色绘制)。问题是,每当我尝试滚动菜单并调用 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 上。

4

1 回答 1

0

Android 不允许您从非 UI 线程修改 UI 组件。换句话说,您不能调用:icon.setVisibility(View.VISIBLE);fromrun()线程的方法。我的假设是,这正是ImageRunnable.

检查 LogCat 是否有任何异常消息。

也许您可以提取在适配器的构造函数中初始化的那部分代码 StateListDrawable,因此它只被调用一次,然后在getView()不使用线程的情况下设置图像可绘制。

于 2013-06-27T08:13:56.570 回答