移植到Kindle Fire时,notifyDataSetChanged()出现问题

时间:2013-09-19 18:36:46

标签: android kindle-fire

所以我将我的Android应用程序移植到Kindle,并期望对兼容性进行一些调整,但这太荒谬了。

我发现的第一件事是,如果你也从onCreate()初始化你的布局,显然从onCreate()运行AsyncTask可能会导致一些问题。这在普通的Android中绝对不是这样,但是我在Kindle上获得的最终结果是我的布局部分根本没有显示。将AsyncTask移动到onStart解决了这个问题,但这有点令人惊讶。我仍然有一个问题,即调用这个AsyncTask。

此AsyncTask的目的是从在线加载数据并在活动的布局中显示结果。非常简单,至少在普通的Android设备上。只需在doInBackground中加载数据,然后在onPostExecute中将数据应用到UI来构建页面。

然而,在某些情况下(并非所有),AsyncTask中的数据似乎不会显示在屏幕上。例如,某些数据显示在GridView中。我更新GridView适配器,使用适配器的notifyDataSetChanged()方法,应该发生的是视图被更改为显示来自适配器的数据。普通Android设备上的此过程运行正常。

然而,在这个Kindle上,数据没有加载(在某些情况下,并非全部,这使得这更令人沮丧)。我发现如果按下Kindle上的后退按钮,然后将手指从它上面移开(因此不会调用finish()),数据有时会显示出来!我觉得对于Kindle的Android版本,notifyDataSetChanged()的正常行为已被改变,但我不确定我还希望将其他数据加载到适配器中。

有没有人遇到过这个问题?

此外,我应该注意,有时它只发生,实际的数据结构保持不变,但对于某些页面它可以工作而其他页面没有(该应用程序属于音乐,所以例如一个艺术家的页面正确加载而另一个则没有。)

我已经包含了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();
    }
}

谢谢!

1 个答案:

答案 0 :(得分:3)

我找到了解决方案。哦,那人花了很长时间,但我终于明白了。

真的很蠢。基本上,xml属性android:animateLayoutChanges将完全打破您的布局。我想Kindle会尝试动画,但会失败,所以最终的结果就是没有发生。从我的应用中删除android:animateLayoutChanges的所有实例解决了问题。

我希望将来遇到此问题的其他人可以通过绊倒这个答案来节省大量时间。