виртуальное устройство Android - взгляды получили странные цвета фона - PullRequest
0 голосов
/ 04 декабря 2011

Я использую текущий Android SDK, r15.

В моем проекте я использую ListViews с настроенными адаптерами, основанными на BaseAdapter.В BaseAdapter :: getView-method есть представление, накачанное из ресурсов XML, настроенное и заполненное текстом;также цвет фона меняется в зависимости от нескольких условий.Это прекрасно работает, но:

На виртуальных устройствах Android (AVD) с Android 3.0 и выше, у меня есть проблема, что в какой-то момент, когда Android пытается перезапустить существующие представления, цвет фонане изменяется, даже если это указано в ресурсе xml.

Должен ли я считать, что это проблема эмулятора Android, или же это может происходить на реальных устройствах?Я никогда не видел эту проблему на реальном устройстве с тем же приложением.

неабстрагированный пример: у меня есть проект с макетом входа в систему (почти белый, с полями ввода и кнопкой),«планшетный» макет, содержащий вид списка контактов и вид списка беседы;после входа я могу выбрать контакт.У онлайн-контактов есть зеленый фон, у офлайн-контактов - белый.После выбора контакта фон контакта становится красным.Разговор загружается в список беседы.Теперь я выхожу из системы, и теперь мой прежний белый логин может быть зеленым или красным, как в контакте 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 Ответ

1 голос
/ 04 декабря 2011

Попробуйте этот фрагмент:

@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 в первый раз, а затем он содержит старые созданные представления, которые подвергаются повторному циклу и должны использоваться.

...