【问题标题】:ArrayList keeps filling with same dataArrayList 不断填充相同的数据
【发布时间】:2012-07-13 12:12:24
【问题描述】:

我有一个非常奇怪的问题。我有一些数据显示在对话框中。如果我关闭应用程序并再次重新打开它,我的 ArrayList 总是会再次添加原始数据(前 5 个条目 -> 关闭并重新打开 -> 10 个条目 -> 关闭并重新打开 -> 15 个条目等)。

这就是我将数据解析到 ArrayList 中的方式(这只在我的 TabHost 中发生一次):

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

非常感谢您的帮助!

【问题讨论】:

    标签: android json arraylist android-alertdialog


    【解决方案1】:

    我认为您在 TabHost 中将 pdfListTitle 视为 static,这可能是问题

    pdfListTitle 应该在每次调用活动时初始化

    例如,您可以像这样在onCreate() 方法中编写此代码

    ArrayList<T> pdfListTitle;
    
    protected void onCreate(Bundle savedInstanceState) {
    
      pdfListTitle = new ArrayList<T>; <----
    
    }
    

    【讨论】:

    • 看起来就是这样!但是我该如何改变呢?因为现在它说:无法对非静态字段 TabHost.pdfListTitle 进行静态引用
    • 所以我必须在我的选项卡中执行此操作?还是在我的 TabHost 中?因为现在我在 TabHost 中实例化并填充我的 ArrayList 并在 Tab 本身中获取条目...
    • 我能够用这个解决方案修复它!非常感谢。
    【解决方案2】:

    我猜在TabHost.pdfListTitle.toArray(..)的方法中,你应该重置你每次填充数据的列表..

    【讨论】:

    • 每次将数据填充到列表之前,请清除列表。
    【解决方案3】:

    简单而幼稚的解决方法是添加

    pdfListTitle.clear()

    在你用数据填充列表之前。

    但这并不能解决每次显示对话框时都会调用该方法的问题,除非您需要它。

    【讨论】:

      【解决方案4】:

      正如之前的用户所说,您应该手动清理列表 (pdfListTitle.clear()),但更深入地了解问题很有用。

      如我所见,您将 pdfListTitle 作为静态字段存储在类 TabHost 中(顺便说一下,使用 TabHost 之类的名称不太好,因为 android API (http://developer.android.com/reference/android/widget/TabHost.html) 中有 TabHost。静态在加载类时首先初始化字段。并且没有任何保证这些类何时会被 Android 系统卸载,因为在 android 中没有“关闭”应用程序。阅读有关类加载器的信息对您很有用在 Java 中(你可以很简单地用谷歌搜索它)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-20
        • 2014-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-19
        • 1970-01-01
        相关资源
        最近更新 更多