【问题标题】:Problems with notifyDataSetChanged() when porting to Kindle Fire移植到 Kindle Fire 时的 notifyDataSetChanged() 问题
【发布时间】:2013-09-19 18:36:45
【问题描述】:

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

我发现的第一件事是,如果您还从 onCreate() 初始化布局,显然从 onCreate() 运行 AsyncTask 可能会导致一些问题。在常规 Android 中绝对不是这种情况,但我在 Kindle 上得到的最终结果是我的部分布局根本没有显示。将 AsyncTask 移动到 onStart 解决了这个问题,但这有点令人惊讶。我仍然有一个涉及这个 AsyncTask 的问题。

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

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

然而,在这台 Kindle 上,数据并没有加载(同样在某些情况下,不是全部,这让这更加令人沮丧)。我发现如果你按下 Kindle 上的返回按钮,然后将你的手指从它上面拖开(所以没有调用 finish()),数据有时会显示出来!我感觉 notifyDataSetChanged() 的正常行为已针对 Kindle 的 Android 版本进行了更改,但我不确定我还需要做什么来显示加载到适配器中的数据。

有人遇到过这个问题吗?

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

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

谢谢!

【问题讨论】:

    标签: android kindle-fire


    【解决方案1】:

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

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

    我希望将来遇到此问题的其他人可以通过偶然发现此答案来节省大量时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      相关资源
      最近更新 更多