とても良い質問です。これに答えてみましょう。
フィルタリングは実際には の再ListView
作成ですが、新しいコレクションを作成/取得し、Adapter
を呼び出してその内容が変更されたことを伝えnotifyDataSetChanged
ます。
listView の「重い」作業は、そのgetView
アダプターでの呼び出しです。私はこれを自分でテストしましたが、getView が呼び出されるたびに新しい View をインフレートすると、パフォーマンスが低下します。天。
ListView のアダプターは、既に膨張したビューを再利用できるように構築されており、上記の問題に取り組みます。また、表示されるビューのみが読み込まれるため、Adapter
コレクションが 10000 個のアイテムであると伝えても、10000 個のビューが作成されるわけではありません。
notifyDataSetChanged
リストビューのコンテンツを再構築するようアダプターに指示しますが、以前に膨張したビューがまだ含まれています。したがって、ここに大きなパフォーマンスの勝利があります。
したがって、私のアドバイスは、同じ「行レイアウト」を使用してListView
using を再作成する場合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();
}
}