Почему MaterialDrawer mikepenz не отображает правильный значок, имя и адрес электронной почты в заголовке учетной записи? - PullRequest
0 голосов
/ 13 января 2019

Я использую MaterialDrawer mikepenz в моем приложении для Android. Приложение поддерживает несколько зарегистрированных профилей одновременно, как в Gmail. Таким образом, в то время как один профиль вошел в систему, другой профиль может быть добавлен, и затем пользователь может переключить активный профиль, нажав на значок в заголовке.

Я использую Volley для асинхронной загрузки изображения профиля с сервера. Это означает, что когда я создаю список ProfileDrawerItems для зарегистрированных профилей (при запуске приложения), я добавляю значок по умолчанию. Он должен быть обновлен, как только запрос Volley вернет правильный значок. Та же логика применяется при добавлении новой учетной записи.

Эта работа частично. Правильные значки отображаются в полном списке учетных записей (под заголовком учетной записи). Но в заголовке учетной записи я все еще вижу значки по умолчанию:

Пример, показывающий значок по умолчанию для последнего добавленного профиля . На этом рисунке показано, как выглядит ящик после добавления нового профиля («Jubi»).

После успешного входа в систему я использую

getAccountHeader().getProfiles().add(loadProfile(token));

чтобы добавить новый профиль в заголовок учетной записи. loadProfile(Token) выглядит так:

   /**
     * Loads and returns the profile for the given token. If a profile already exists in the map profilesByUserId for the token's userID, that profile is updated, otherwise a new profile is created and put into that map.
     * The returned profile might not yet be ready, when this method returns. Some date is loaded asynchronously: Picture, username, user's first and last name.
     *
     * @param token the token, for which the profile should be created or updated
     * @return the profile
     */
    public ProfileDrawerItem loadProfile(Token token) {
        ProfileDrawerItem profile = profilesByUserId.get(token.getUserId());
        if (profile == null) {
            profile = new ProfileDrawerItem();
            profilesByUserId.put(token.getUserId(), profile);
            profile.withIdentifier(token.getId());
            profile.withName(token.getUsername());
            profile.withIcon(R.drawable.default_profile_pic);
        }

        loadProfileData(token);
        loadProfilePic(token);
        return profile;
    }

loadProfileData(Token) и loadProfilePic(Token) содержат запросы залпа. onSuccess(...) вызывается, когда запрос успешно возвращается.

loadProfileData(Token)

   /**
     * Loads the profile data (user's name and email address) for the given token and sets it in the appropriate profile. If there is no profile for the given token, nothing happens.
     *
     * @param token token, for which the profile data should be loaded
     */
    private void loadProfileData(final Token token) {

        final ProfileDrawerItem profile = profilesByUserId.get(token.getUserId());
        if (profile == null)
            return;

        // Load name and email address
        Callback<User> callbackUser = new Callback<User>() {
            @Override
            public void onSuccess(User user) {
                profile.withName(String.format("%s %s", user.getFirstName(), user.getLastName()));
                profile.withEmail(user.getUsername());
                profile.withNameShown(true);
            }

            @Override
            public void onError(String error) {
               // not relevant
            }
        };
        loadUserById(token.getUserId(), Source.LOCAL_OVER_REMOTE, callbackUser, token);
    }

loadProfilePic(Token)

    /**
     * Loads the profile pic for the given token and sets it in the appropriate profile. If there is no profile for the given token, nothing happens.
     *
     * @param token token, for which the profile pic should be loaded
     */
    private void loadProfilePic(final Token token) {

        final ProfileDrawerItem profile = profilesByUserId.get(token.getUserId());
        if (profile == null)
            return;

        // Load profile pic
        Callback<File> callbackPic = new Callback<File>() {
            @Override
            public void onSuccess(File profilePic) {
                Bitmap bitmap = FileUtils.createBitmap(profilePic);
                // Crop center square of the bitmap
                int dimension = Math.min(bitmap.getWidth(), bitmap.getHeight());
                bitmap = ThumbnailUtils.extractThumbnail(bitmap, dimension, dimension);
                profile.withIcon(bitmap);

            }

            @Override
            public void onError(String error) {
                // Not relevant
            }
        };
        loadProfilePicById(token.getUserId(), true, callbackPic, true);
    }

Я ожидаю, что после выполнения onSuccess(File) новое изображение профиля должно отображаться в заголовке учетной записи и в списке учетных записей под заголовком. Однако изображение, имя и адрес электронной почты в заголовке учетной записи не обновляются. Только после переключения профилей, который выполняет getAccountHeader().setActiveProfile(token.getId()), правильные данные и рис отображаются в заголовке учетной записи.

Для меня это выглядит так, как будто это проблема с MaterialDrawer, но я не уверен в этом. И даже если бы это было, возможно, есть обходной путь.

Кто-нибудь знает, как я могу заставить MaterialDrawer обновить заголовок учетной записи после изменения профиля или как еще я могу решить эту проблему?

...