0

レイアウトは基本的なものです。上部に EditText があり、その後に ListView が続きます。EditText には TextWatcher.onTextChanged が実装されているため、入力されたテキストで ArrayAdapter.getFilter.filter が呼び出されます。ArrayAdapter のデータは、再開時に非同期に更新されます (以下のコード スニペットを参照)。簡単で、うまく機能します...画面の向きが変更されるまで。電話を横向きにすると、フィルタリングが突然壊れるのはなぜですか?

public class SometActivity extends ListActivity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        ...
        listAdapter = new ArrayAdapter<MemoryStatistic>(this, R.layout.list_item);
        setListAdapter(listAdapter);
        searchText = (EditText)findViewById(R.id.searchText);
        searchText.addTextChangedListener(new TextWatcher()
        {
            @Override
            public void onTextChanged(CharSequence text, int start, int before, int count)
            {
                listAdapter.getFilter().filter(text);
            }
            ...
        }
        ...
    }

    @Override
    protected void onResume()
    {
        asyncRefreshListAdapter();//refresh the data asynchronously when activity is resumed
    }
}
4

1 に答える 1

1

Android 開発に不慣れな他のプログラマー (私のような) がこれに困惑した場合に備えて、この自己返信投稿を作成すると思いました。そのため、 Android のリファレンスによると、onResume はアクティビティが次の場合にのみ呼び出されます。

1) 作成

2) 再起動

3) 再開 (再開後にフォアグラウンドに移動)

では、画面の向きはこれと何の関係があるのでしょうか? ドキュメントを読んでいるほとんどの開発者は、読むべきことがたくさんあり、何かクールなものを実装したいだけであるという事実のために、ざっと目を通してしまいます。私も同じでした。もっと読んでいれば、後で頭痛の種を避けることができたでしょう。

特に指定しない限り、構成の変更 (画面の向き、言語、入力デバイスなどの変更など) により、現在のアクティビティが破棄されます。

これで、フィルターが正しく機能しない理由が明らかになりました。問題は、(画面の向きの変更でアクティビティが破棄されると) listAdapter が完全に読み込まれないか、まったく読み込まれないことでした (更新の非同期性のため) フィルタリングが開始されます。

于 2010-06-11T15:52:50.867 に答える