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());
}

このメソッドには、インターネットからプルダウンされた取引オブジェクトの配列リストが渡されます。アプリケーションが最初に開かれると、データがインターネットからプルされ、上記のメソッドが呼び出されて、ListFragmentに設定された新しいアダプターが作成されます。このメソッドは、ユーザーがさらに取引を要求したときにも呼び出されます。

私が抱えている問題は、アダプターに取引が含まれているにもかかわらず、リストが空であると考えることがあるということです。これは、デバイスのメモリが不足しているときにアプリケーションを再開したときに発生するようです(アプリケーションの一部がRAMから削除されたと思います)。このメソッドが呼び出され、dealListAdapterがnullであるため、新しいメソッドが作成され、取引が追加されます。これが発生しても、リストは空のままであり、ユーザーはアプリを強制的に閉じて再び機能させる必要があります。

以下の行は、メソッドが呼び出されたときのtatを示しており、ifと21の取引がアダプターに追加されます。残念ながら、リストはユーザーには空です。

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

3 に答える 3

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 に答える
0

次のオプションの1つ以上を試すことができます

  • setListShown(false)リストアダプタを設定する直前に呼び出してみてください。

  • それ以外の場合は、
    setListShown(false);
    setListAdapter(null);

  • それ以外の場合は、requestLayout()

于 2012-05-30T18:28:36.763 に答える
0

1つのアイデア(かなり長いショット:)

アプリ自体が強制終了されなかった場合、アクティビティのみが強制終了された場合、システムはonRestoreInstanceState()を呼び出して、アクティビティの最後の状態を再作成しようとします。アプリが強制終了された場合、このメソッドは呼び出されません。したがって、これは2つの大きな違いの1つです。

ListActivityは、onRestoreInstanceState()をオーバーライドします。それは、リストが続く前に、リストが存在することを保証します。リストが存在しない場合は、デフォルトの場所からリストを膨らませます。

onResume()でcontentViewを設定している場合は、それをonCreate()に移動してみてください。これで、問題が解決する場合があります。

アクティビティのコードが表示されれば、さらに支援できます。

于 2012-05-31T16:05:22.553 に答える