notifyDatasetChanged() を再度呼び出すまで、getView 呼び出しを停止するにはどうすればよいですか?
私の問題:
textchange でアダプタをフィルタリングするテキストフィールドがあります。テキストを頻繁に変更しすぎると、ArrayIndexOutOfBoundsException が発生します。これは、セカンダリ フィルタリング操作が既に実行されている間でも、もちろん getView がアダプタのリストにアクセスしているためです。
したがって、ATM は次のようになります。
- バックグラウンドでフィルター + notifyDatasetChanged
- GetView が複数回呼び出されました
- 次のフィルターが処理されている間、GetView は最初のフィルターのためにバックグラウンドでまだ呼び出されています。しかし、GetView はリスト アクセスのため例外を取得します (フィルタリング操作はリストを変更します)。したがって、GetView 呼び出しを停止し、特定のフィルター操作を開始したいと考えています。
編集:
フィルター スレッドがアクティブであることがわかったら、すぐに getview から戻ることを考えていましたか?
編集:
OK 関連アダプターコード:
@Override
protected FilterResults performFiltering(CharSequence constraint) {
filterLock.acquireUninterruptibly();
FilterResults r = new FilterResults();
List<T> items = null;
m_Filter = constraint;
if (constraint == null /* TextUtils.isEmpty(constraint) */) { // AR
// auskommentiert
// da
// ungewünscht
items = m_AllItems;
} else {
items = m_FilteredItems;
items.clear();
synchronized (SyncLock) {
for (T item : m_AllItems) {
if (DynamicArrayAdapter.this.filter(item, constraint)) {
items.add(item);
}
}
}
}
r.values = items;
r.count = items.size();
return r;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
m_Items = (List<T>) results.values;
notifyDataSetChanged();
filterLock.release();
}
Filter を拡張したフィルタです。m_Items と m_AllItems がアダプターで使用されます (最初の項目にはフィルター処理されたものが含まれ、2 番目にはフィルター処理されていない項目が含まれます)。ご覧のとおり、performFiltering() で変更されていません。また、filterLock はサイズ 1 のセマフォであるため、2 つのフィルタリング操作が同時に行われることはありません。
EDIT2:
また、私の onTextChanged では、アダプターを変更しないことを保証できます。また、performFiltering() から呼び出される filter() メソッドでも変更しません。