2

私はアイスクリームサンドイッチAPIをサポートするAndroidアプリに取り組んでいますが、Android2.1の実行などの古いデバイスで動作します。

これを行うには、現在のAPIバージョンを確認し、アイスクリームサンドイッチが1つのアクティビティを呼び出し、それ以下の場合は別のアクティビティを呼び出します。

ユーザーが検索を実行できるようにしています。結果が得られたら、ArrayListをクリアしてから、検索からアイテムを追加し直して、arrayadapter.notifydatasetchangedを呼び出します。ICSバージョンからプレICSバージョンにコピーして貼り付けたこのコード。ICSは正常に動作しますが、プレICSバージョンではリストビューが更新されません。以下は私が持っているコードです。

public void performSearch(ArrayList<Spanned> searchPasswords)
    {
        if (searchPasswords.size() > 0)
        {
            btnClearSearch.setVisibility(View.VISIBLE);
            passwords.clear();
            for (int i = 0; i < searchPasswords.size(); i++)
            {
                passwords.add(searchPasswords.get(i));
            }

            passwordArrayAdapter.notifyDataSetChanged();
            btnClearSearch.setOnClickListener(mBtnClearSearch);
            common.showToastMessage(searchPasswords.size() + " result(s) found", Toast.LENGTH_LONG);
        }
        else
        {
            common.showToastMessage("No search results found", Toast.LENGTH_LONG);
        }
    }

この関数をデバッグしたので、明確に呼び出して、結果がいくつ見つかったかを示すトーストメッセージを表示しますが、リストビューは変更されません。

アップデート

少し紛らわしい発見をしました。リストビューの初期読み込みを行う関数のテストとして、手動で新しい検索を作成し、ArrayList<Spanned>これを問題のあるものに渡しPerformSearch(ArrayList<Spanned>ます。これは問題なく機能します。

PerformSearchがListViewを更新しないという問題は、onActivityResultから呼び出されている場合にのみ発生するようです。onActivityResultは正常に機能していることを知っています。これは、performSearch関数が呼び出されたときに、1つの結果が見つかったために出力されるため、performSearch関数を呼び出したonActivityResultからリストビューだけが更新されないため、確実に取得されたデータです。

4

7 に答える 7

0
passwords.clear();
for (int i = 0; i < searchPasswords.size(); i++)
{
  passwords.add(searchPasswords.get(i));
}
passwordArrayAdapter.notifyDataSetChanged();

コードに従って、リスト(パスワード)を変更しますが、アダプター(passwordArrayAdapter)によって使用されているのと同じインスタンスです。そうでない場合、notifyDataSetChanged()は機能しません。

私の理解では、passwordArrayAdapterの新しいインスタンスを使用してリストを再設定することができます。

ur_list_view.setAdapter(new PasswordArrayAdapter(newly_formed_password_list, and other parameters));

または、getterとsetterを使用してリスト(パスワード)を更新してから、notifyDataSetChanged()を呼び出します。

于 2012-10-08T13:02:34.820 に答える
0

あなたが試すことができます:

passwordArrayAdapter = new WHAT_EVER_ADAPTER_THIS_IS(searchPasswords, extra_constructor_params);
YOUR_LIST_VIEW.setAdapter(passwordArrayAdapter)

それ以外の:

    passwordArrayAdapter.notifyDataSetChanged();
于 2012-10-04T20:51:10.590 に答える
0

同様の問題がありました。notidfyDataSetChanged()もsetAdapter()も機能しませんでした。

最後に、notifyDataSetChanged()を使用するほど効率的ではないかもしれないが、機能する解決策を見つけました。

/**
 * Updates courses' list adapter.
 */
private void updateListAdapter()
{
    final ArrayAdapter a = (ArrayAdapter) coursesList.getAdapter();

    runOnUiThread(new Runnable()
    {
        public void run()
        {
            populteCoursesList();
            a.clear();

            for (MainScreenListModel model : listModels)
            {
                a.add(model);
            }
            a.notifyDataSetChanged();
        }
    });
}

courseListは私のカスタムリストです。PopulateCoursesList()はdbからデータを取得し、listModelsはリストビューのモデルのベクトルです。ご覧のとおり、アダプターをクリアして、もう一度入力する必要があります。

于 2012-10-04T22:11:58.023 に答える
0

私はあなたの間違いはアダプターをクリアするのを忘れることだと思います、あなたがこのようにそれを試みるならばそれはうまくいくはずです:

public void performSearch(ArrayList<Spanned> searchPasswords)
    {
        if (searchPasswords.size() > 0)
        {
            btnClearSearch.setVisibility(View.VISIBLE);
            passwordArrayAdapter.clear();
            for (int i = 0; i < searchPasswords.size(); i++)
            {
                passwordArrayAdapter.add(searchPasswords.get(i));
            }
            passwordArrayAdapter.notifyDataSetChanged();
            btnClearSearch.setOnClickListener(mBtnClearSearch);
            common.showToastMessage(searchPasswords.size() + " result(s) found", Toast.LENGTH_LONG);
        }
        else
        {
            common.showToastMessage("No search results found", Toast.LENGTH_LONG);
        }
    }
于 2012-10-05T12:38:35.233 に答える
0

貼り付けたコードスニペットだけではよくわかりませんが、パスワードとpasswordsArrayAdapterの間に永続的なリンクはありません。passwordsArrayAdapterはパスワードの要素で初期化され、passwordsArrayAdapterはパスワードがいつ変更されるかを認識しません。新しいアイテムを追加するには、passwordsArrayAdapter.add(searchPasswords)を呼び出す必要があります。notifyDataSetChanged()を明示的に呼び出さないでください。

public void performSearch(ArrayList<Spanned> searchPasswords)
    {
       if (searchPasswords.size() > 0)
       {
            btnClearSearch.setVisibility(View.VISIBLE);
           passwordArrayAdapter.clear();
           passwordArrayAdapter.setNotifyOnChange(true);
         for (int i = 0; i < searchPasswords.size(); i++)
         {
               passwordArrayAdapter.add(searchPasswords.get(i));
         }
            btnClearSearch.setOnClickListener(mBtnClearSearch);
            common.showToastMessage(searchPasswords.size() + " result(s) found", Toast.LENGTH_LONG);
       }
        else
        {
            common.showToastMessage("No search results found", Toast.LENGTH_LONG);
        }
    }

onActivityResultビットとの関係はないと思います-上記のコードで修正する必要があります。

于 2012-10-09T07:56:33.410 に答える
0

notifyOnChange(false)新しいエントリをクリアして追加する前に呼び出してください。それ以外の場合、clear()およびすべてがadd()内部でへの呼び出しをトリガーしますnotifyDataSetChanged()。これは、私が経験したように、ListViewを混乱させます。明示的なを保持しますnotifyDataSetChanged()。これにより、内部notifyOnChangeフラグもtrue再びリセットされます。

于 2012-10-14T14:55:50.623 に答える
0

皆さんの助けと提案に感謝します、私は何とか問題が何であったかを知ることができました。

アクティビティのOnResumeメソッドで、populateListArrayという関数を呼び出します。この関数は、データベースとリストビューのリストからすべての情報を取得します。

アクティビティが返されたとき、それはOnResumeメソッドを呼び出していたので、結果を取得した後、リストビューをすべての元のコンテンツでリセットしました。

performingSearchそれを回避するために、falseに初期化するという変数を追加しました。検索を実行するとき、これをtrueに設定し、onResumeで、変数がtrueの場合は何もせず、検索の実行機能が終了した後、変数を再びfalseに設定します。

皆さんの助けにもう一度感謝します

于 2012-12-01T23:34:29.253 に答える