在listview中调用Android图标的Android setImageDrawable使列表消失

时间:2013-06-27 07:25:43

标签: android android-listview

我在我的应用程序中使用菜单,其中所有菜单项都存储在列表中。当调用方法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。

1 个答案:

答案 0 :(得分:0)

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

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

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