Проблемы с notifyDataSetChanged() при переносе на Kindle Fire

Итак, я переношу свое приложение для Android на Kindle и ожидал некоторых изменений для совместимости, но это становится нелепым.

Первое, что я обнаружил, это то, что запуск AsyncTask из onCreate() может вызвать некоторые проблемы, если вы также инициализируете свой макет из onCreate(). Это определенно не так в обычном Android, но конечный результат, который я получил на Kindle, заключался в том, что части моего макета вообще не отображались. Перемещение AsyncTask в onStart решило проблему, но это немного удивило. У меня все еще есть проблема с этой AsyncTask.

Целью этой AsyncTask является загрузка данных из Интернета и отображение результата в макете действия. Довольно просто, по крайней мере, на обычных устройствах Android. Просто загрузите данные в doInBackground, а затем в onPostExecute примените данные к пользовательскому интерфейсу для создания страницы.

Однако кажется, что в некоторых случаях (не во всех) данные из AsyncTask не будут отображаться на экране. например, некоторые данные отображаются в GridView. Я обновляю адаптер GridView, использую метод адаптера notifyDataSetChanged(), и должно произойти изменение представления для отображения данных из адаптера. Этот процесс на обычном устройстве Android работает нормально.

Однако на этом Kindle данные не загружаются (опять же, в некоторых случаях не все, что еще больше расстраивает). Я обнаружил, что если вы нажмете кнопку «Назад» на Kindle, а затем уберете с нее палец (поэтому не вызывается функция finish()), данные иногда будут отображаться! Я чувствую, что нормальное поведение notifyDataSetChanged() было изменено для версии Android Kindle, но я не уверен, что еще я должен сделать, чтобы показать данные, загруженные в адаптер.

Кто-нибудь сталкивался с этой проблемой?

Кроме того, я должен отметить, что в случае, если это происходит только иногда, фактическая структура данных остается постоянной, но для определенных страниц она работает, а для других нет (приложение относится к музыке, поэтому, например, страница одного исполнителя загружается правильно, а страница другого не).

Я включил рассматриваемую AsyncTask, она отлично работает на любом устройстве Android, поэтому я не знаю, какая польза от нее будет, но здесь все равно:

private class GetAttendees extends AsyncTask<Void, Void, AttendeesSectionData> {

    @Override
    protected AttendeesSectionData doInBackground(Void... params) {
        JsonHandler jsonHandler = new JsonHandler(getApplicationContext());
        return jsonHandler.getEventAttendeesFromFb(mEvent.getFacebookEventId(), JsonHandler.FACEBOOK_FRIENDS_NO_LIKES);
    }

    @Override
    protected void onPostExecute(AttendeesSectionData data) {
        if(data != null && !data.isEmpty()) {

            if(data.size() > 18) {
                ArrayList<String> toShow = new ArrayList<String>();

                int friendLimit = data.getFriendsAttendingIds().size();
                if(friendLimit > 18)
                    friendLimit = 18;

                for(int i = 0; i < friendLimit; i++)
                    toShow.add(data.getFriendsAttendingIds().get(i).getImageURL());

                int toShowSizeAfterFriends = toShow.size();

                if(toShowSizeAfterFriends < 18) {
                    int othersLimit = data.getNonFriendsAttendingIds().size();
                    if(othersLimit > 18 - toShowSizeAfterFriends)
                        othersLimit = 18 - toShowSizeAfterFriends;

                    for (int i = 0; i < othersLimit; i++)
                        toShow.add(data.getNonFriendsAttendingIds().get(i).getImageURL());

                }

                mFbImagesAdapter.setItems(toShow);
            }
            else
                mFbImagesAdapter.setItems(data.unloadIntoOneArrayList());

            String caption = String.format(AppSettings.ATTENDEE_HEADER_CAPTION, 
                    //fill in the %s with:
                    data.getFriendsAttendingIds().size(), 
                    data.getNonFriendsAttendingIds().size());

            caption = caption.replace("*", "<b>");
            caption = caption.replace("?", "</b>");

            mAttendeesCaption.setText(Html.fromHtml(caption));

            calculateGridSize(data.size());
        }
        else {
            Print.log("no attendees for event " + mEvent.getVenue_FormattedLocation());
            mAttendeesGrid.setVisibility(View.GONE);
            mAttendeesHeaderContainer.setVisibility(View.GONE);
        }

        loadFacebookImages();
    }
}

Спасибо!


person JMRboosties    schedule 19.09.2013    source источник


Ответы (1)


Я нашел решение. О, чувак, это заняло ДОЛГОЕ время, но я, наконец, понял.

Это действительно глупо. По сути, атрибут xml android:animateLayoutChanges полностью нарушит ваши макеты. Я предполагаю, что Kindle попытается анимировать, но потерпит неудачу, поэтому в конечном результате ничего не происходит. Удаление всех экземпляров android:animateLayoutChanges из моего приложения устранило проблему.

Я надеюсь, что кто-то еще, у кого возникнет эта проблема в будущем, может сэкономить массу времени, наткнувшись на этот ответ.

person JMRboosties    schedule 19.09.2013