2

本当にいくつかのアドバイスの後。私のアプリは、メディアストア カーソルを使用してロード時にリスト ビューを埋めます。これは、ほとんどの場合、保存されているすべての音楽である、ユーザー定義のフォルダーにリンクされた音楽をプルしています。Android 2.2 を実行し、約 10000 曲の Archos タブレットを使用しているベータ テスターが 1 人います。ほとんどのユーザーのパフォーマンスは非常に優れていますが、このようなユーザーのエクスペリエンスを改善したいと考えていました。

現在のプロセス:

ユーザーがアプリをロードします。アプリがデフォルト フォルダを見つける アプリがそのフォルダ内およびその下のリスト ビューに音楽を入力する ユーザーがツリーのさらに下のフォルダに移動し、選択したフォルダに基づいてリスト ビューが再作成される ユーザーが再び移動する...選択したフォルダに基づいてリストが再作成される..

だから私が疑問に思っているのは、次のプロセスを使用する方が高速/効率的ですか? IS FILTERED TO THAT FOLDER ユーザーがデフォルト データよりもツリーの上位に移動した場合 (つまり、新しいファイルの可能性がある場合)、リスト ビューが再作成されますが、この状況でのみです。

つまり、基本的に、私の質問は「フィルタリングは再移植と比べてどうですか?」ということです。

4

1 に答える 1

3

とても良い質問です。これに答えてみましょう。

フィルタリングは実際には の再ListView作成ですが、新しいコレクションを作成/取得し、Adapterを呼び出してその内容が変更されたことを伝えnotifyDataSetChangedます。

listView の「重い」作業は、そのgetViewアダプターでの呼び出しです。私はこれを自分でテストしましたが、getView が呼び出されるたびに新しい View をインフレートすると、パフォーマンスが低下します。天。

ListView のアダプターは、既に膨張したビューを再利用できるように構築されており、上記の問題に取り組みます。また、表示されるビューのみが読み込まれるため、Adapterコレクションが 10000 個のアイテムであると伝えても、10000 個のビューが作成されるわけではありません。

notifyDataSetChangedリストビューのコンテンツを再構築するようアダプターに指示しますが、以前に膨張したビューがまだ含まれています。したがって、ここに大きなパフォーマンスの勝利があります。

したがって、私のアドバイスは、同じ「行レイアウト」を使用してListViewusing を再作成する場合notifyDataSetChangedです。UI パフォーマンスの問題に気付かずに、これを自分で何度も実装しました。バックグラウンド スレッドでコレクションのフィルタリングを行うようにしてください。(AsyncTaskここで便利です)。

最後のヒント: かなり古い電話をお持ちですか? それとも知ってる人?できるだけ遅い電話を見つけて、その電話でアプリケーションのパフォーマンスをテストします。私自身、HTC Legend を持っています。これは時代遅れで、性交すると遅くなりますが、パフォーマンス テストには最適です。私の(古い)電話で動作する場合は、どの電話でも動作します。

アプリケーションがフローする場合の疑似コード サンプル:

public class FolderListActivity extends Activity implements OnItemSelected {

    // NOTE: THIS IS PSEUDO CODE

    private ListView listView
    private Adapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstaceState);

        // setContentView here 
        listView = (ListView)findViewById(R.id.your_listview_here);
        listView.setOnItemSelectedListener(this);
    }

    public class AsyncLoadMusicLocationTask extends AsyncTask<Void, Void, List<String>> {

        public List<String> doInBackground(Void... params) {
            // Load the information here, this happens in the background
            // using that cursor, i'm not sure what kind of things you are using
            // So I assumed a List of Strings
        }

        @Override
        public void onPostExecute(List<String> result) {
            // Here we have our collection that was retrieved in a background thread
            // This is on the UI thread

            // Create the listviews adapter here
            adapter = new Adapter(result, and other parameters);
            listView.setAdapter(adapter);
        }
    }

    @Override
    public void onItemSelect(Some params, not sure which) {

        // THIS SHOULD BE DONE ON THE BACKGROUND THE PREVENT UI PERFORMANCE ISSUES

        List<String> collection = adapter.getObjects();
        for (int i = 0; i < collection.size(); i++) {
            // Filter here
        }

// this method will most probably not exist, so you will need to implement your own Adapter class
        adapter.setObjects(collections);
        adapter.notifyDataSetChanged();
    }
}
于 2012-07-19T08:18:03.793 に答える