android虚拟设备 - 视图得到奇怪的背景颜色

时间:2011-12-03 20:21:06

标签: android avd

我正在使用当前的Android SDK,r15。

在我的项目中,我使用基于BaseAdapter的自定义适配器的ListViews。在BaseAdapter :: getView方法中,有一个视图,从xml资源中膨胀并自定义并填充文本;根据几个条件,背景颜色也会改变。这很有用,但是:

在Android 3.0及更高版本的Android虚拟设备(AVD)上,我遇到了问题,在某些时候,当Android尝试回收现有视图时,背景颜色不会改变,即使它在xml ressource。

我应该假设,这是Android模拟器的问题,或者可能是这也发生在真实设备上? 我从未在真实设备上看到过这个问题,使用相同的应用程序。

非抽象示例: 我有一个带登录布局的项目(几乎是白色,带有输入字段和一个按钮),一个“平板电脑” - 包含联系人列表视图和会话列表视图的布局;登录后,我可以选择一个联系人。在线联系人有绿色背景,离线联系人有白色背景。选择联系人后,联系人的背景变为红色。会话被加载到会话listView中。现在我注销了,现在可能是我以前的白色登录是绿色或红色,就像之前的联系人ListView一样。此外,甚至我的对话listView-Entries也可以继承联系人listView元素的颜色,忽略xml中指定的背景颜色。这似乎是随机的。

缩短的getView代码: (只是排除了设置'profileImage'的代码)

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = inflater.inflate(R.layout.contacts_listelement, parent, false);

        int userId = contactList.get(position);
        BackendStamp user = users.get(userId);

        ImageView profileImage = (ImageView)view.findViewById(R.id.profilePicture);
        TextView username = (TextView)view.findViewById(R.id.username);
        TextView unreadMails = (TextView)view.findViewById(R.id.unreadMails);
        ImageView userStatus = (ImageView)view.findViewById(R.id.userStatus);

        if (user != null) {

            if (user.getUnreadMails() == 0) {
                unreadMails.setBackgroundResource(R.drawable.bgmessagesnull);
                unreadMails.setTextColor(0xff000000);
            }
            else {
                unreadMails.setBackgroundResource(R.drawable.bgmessagesnotnull);
                unreadMails.setTextColor(0xffffffff);
            }

            if (user.getStatus() == 0) {
                view.setBackgroundColor(0xFFFFFFFF);
            }
            else {
                view.setBackgroundColor(0xFFEFFFD4);
            }

// [...]

            username.setText(user.getNickname());
            unreadMails.setText("" + user.getUnreadMails());

// [...]            

        }

        return view;
    }

1 个答案:

答案 0 :(得分:1)

试试这个代码段:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view;
    if(convertView == null) {
      view = inflater.inflate(R.layout.contacts_listelement, parent, false);
    }
    else {
      view = convertView;
    }

即使这不能解决您的问题,这对您的ListView也有很好的性能提升。当Android尝试重新使用视图时,convertView第一次为null,然后它包含旧创建的视图,这些视图将重新循环并应该使用。