5

我在市场上有一个应用程序有一个我似乎无法解决的错误。今天我把它追踪到了下面的方法。

public void updateDealList(ArrayList<Deal> deals) {
    // first call or showing bookmakrs (also gets called other times when adapter is null)
    if (dealListAdapter == null || showingBookmarks || !dealListAdapter.moreDealsToDownload()) { 
        dealListAdapter = new EndlessDealListAdapter(getActivity(),
                R.layout.deal_list_item, deals);
        setListAdapter(dealListAdapter);
        listView = getListView();
        if (getActivity().findViewById(R.id.right_fragment_container)!=null){ // if tablet
            listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
            listView.setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_LEFT);
        }
        showingBookmarks=false;
        Log.d("UPDATE_DEAL_LIST", "Notified list  created new" + dealListAdapter.getCount());
        return; //PROBLEM OCCURS WHEN APP COMES IN HERE AFTER RESUMING
    }
    dealListAdapter.getDealListAdapter().clear();
    for (Deal d: deals){
        dealListAdapter.getDealListAdapter().add(d);
        Log.d("UPDATE_DEAL_LIST", "added " + d.title);
    }
    dealListAdapter.notifyDataSetChanged();
    Log.d("UPDATE_DEAL_LIST", "Notified list " + dealListAdapter.getCount());
}

此方法传递一个从 Internet 下拉的交易对象的数组列表。当应用程序第一次打开时,从互联网上提取数据并调用上述方法,该方法会创建一个为 ListFragment 设置的新适配器。当用户请求更多交易时,也会调用此方法。

我遇到的问题是列表有时认为它是空的,尽管适配器包含交易。当用户在设备内存不足时恢复应用程序时,这似乎会发生(我认为应用程序的一部分已从 ram 中删除)。调用此方法并且 dealListAdapter 为空,因此创建了一个新方法并添加了交易。尽管发生这种情况,列表仍然是空的,用户必须强制关闭应用程序才能让它再次工作。

下面的行显示了当方法被调用时它进入 if 并且 21 个交易被添加到适配器。不幸的是,该列表对用户来说是空的。

05-23 01:52:32.879: D/UPDATE_DEAL_LIST(3478): Notified list  created new21
4

3 回答 3

0

一个想法(相当长的镜头:)

如果应用程序本身没有被杀死,只是 Activity,系统会尝试重新创建 Activity 的最后状态,调用 onRestoreInstanceState()。如果应用程序被杀死,则不会调用此方法 - 所以这是两者之间的最大区别之一。

ListActivity 覆盖 onRestoreInstanceState()。它确保列表在继续之前存在。如果列表不存在,它会从默认位置对其进行扩充。

如果您在 onResume() 中设置 contentView,请尝试将其移至 onCreate(),这可能会解决问题。

如果我看到活动的代码,我可以提供更多帮助。

于 2012-05-31T16:05:22.553 回答
0

您可以尝试以下一种或多种选择

  • 尝试setListShown(false)在设置列表适配器之前调用。

  • 否则,做
    setListShown(false);
    setListAdapter(null);

  • 否则,做requestLayout()

于 2012-05-30T18:28:36.763 回答
0

我真的不知道这是否会有所帮助,但以下方法应该根据其子项调整您的列表大小。我不明白为什么有时 notifyDataSetChanged() 不起作用,列表根本没有改变,但是使用它解决了我的问题。

    public static class Utility {
    public static void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            return;
        }


        int totalHeight = 0;
        int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST);
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
            totalHeight += listItem.getMeasuredHeight();
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        int newHeight = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        if (newHeight >= 100)
            params.height = newHeight;  
        else 
            params.height = 100;
        listView.setLayoutParams(params);
        listView.requestLayout();
    }
}

希望能帮助到你!

于 2012-05-29T12:09:59.220 回答