0

私は非常に奇妙な問題を抱えています。ダイアログに表示するデータがあります。アプリを閉じて再度開くと、ArrayList は常に元のデータを追加します (最初の 5 エントリ -> 閉じて再度開く -> 10 エントリ -> 閉じて再度開く -> 15 エントリなど)。

これは、データを ArrayList に解析する方法です (これは、TabHost で 1 回だけ発生します)。

JSONArray jPDFs = json.getJSONArray("pdfs");
            for (int i = 0; i < jPDFs.length(); i++) {
                JSONObject c3 = jPDFs.getJSONObject(i);

                String pdf_title = c3.getString("title");
                String pdf_url = c3.getString("url");

                pdfListTitle.add(pdf_title);
                pdfListTitle2.add(pdf_title);
                pdfListURL.add(pdf_url);
            }

そして、解析されたデータを含むダイアログを表示するコードは次のとおりです。

public void showDialog() {
    items = null; // have tried with and without...
    builder = null; // have tried with and without...

    builder = new AlertDialog.Builder(this);
    Log.e(TabHost.LOG_TAG, "pdfListTitle=" + TabHost.pdfListTitle.size()); // this always hops from 5 -> 10 -> 15 on every reopen (without killing the app with a taskkiller...)

    items = TabHost.pdfListTitle.toArray(new CharSequence[TabHost.pdfListTitle.size()]);

    builder.setTitle(R.string.choose_document);
    builder.setItems(items, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int item) {
            WebView wv = (WebView) findViewById(R.id.webviewpdf);
            wv.setWebViewClient(new WebViewClient());
            wv.getSettings().setJavaScriptEnabled(true);
            wv.getSettings().setBuiltInZoomControls(true);
            wv.loadUrl("http://docs.google.com/gview?embedded=true&url="
                    + TabHost.pdfListURL.get(item));
        }
    });
    AlertDialog alert = builder.create();
    alert.show();
}

助けてくれてありがとう!

4

4 に答える 4

2

TabHostpdfListTitlestaticとして使用したと思いますが、これは問題になる可能性があります

pdfListTitle は、アクティビティが呼び出されるたびに初期化する必要があります

たとえば、このコードを次のonCreate()ようなメソッドで書くことができます

ArrayList<T> pdfListTitle;

protected void onCreate(Bundle savedInstanceState) {

  pdfListTitle = new ArrayList<T>; <----

}
于 2012-07-13T12:19:49.183 に答える
1

メソッド TabHost.pdfListTitle.toArray(..)では、毎回データを入力するリストをリセットする必要があると思います..

于 2012-07-13T12:15:41.237 に答える
0

前のユーザーが言ったように、手動でリストを消去する必要がありますpdfListTitle.clear()が ( )、問題をより深く理解することは役に立ちます。

ご覧のとおりpdfListTitle、クラス TabHost に静的フィールドとして保存します (ちなみに、Android API には TabHost があるため、TabHost のような名前を使用するのはあまり適切ではありません ( http://developer.android.com/reference/ android/widget/TabHost.html ). クラスが読み込まれると、最初に静的フィールドが初期化されます. Android システムによってこれらのクラスがいつアンロードされるかは保証されません. Android には「閉じる」アプリケーションがないためです. Javaのクラスローダーについて読むのに役立ちます(非常に簡単にグーグルで検索できます)。

于 2012-07-13T12:22:47.477 に答える
0

シンプルで単純な回避策は、追加することです

pdfListTitle.clear()

リストにデータを入力する前に。

ただし、必要でない限り、ダイアログが表示されるたびにメソッドが呼び出されるという問題は解決されません。

于 2012-07-13T12:19:07.317 に答える