如何停止getView調用,直到我再次調用notifyDatasetChanged()?ArrayAdapter - 如何停止getView調用?
我的問題:
我有一個文本框來過濾textchange上的適配器。如果我經常更改文本,我會得到ArrayIndexOutOfBoundsException,因爲getView當然仍在訪問適配器列表,而後續過濾操作已在運行。
所以ATM它是這樣的:在後臺
- 過濾器+ notifyDatasetChanged
- GetView多次調用
- 當正在處理的一個過濾器,GetView仍然被稱爲是因爲背景第一個過濾器。但是,由於列表訪問(篩選操作更改列表),GetView會得到異常。所以我想停止GetView調用,然後啓動任何給定的過濾器操作。
編輯:
我想從getview回來,如果我立刻看到過濾線程處於活動狀態的?
編輯:
確定相關的適配器代碼:
@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();
}
這是從過濾器擴展的過濾器。在適配器中使用m_Items和m_AllItems(第一個包含過濾器,第二個未過濾)。正如你可以看到它們在performFiltering()中沒有被修改。此外,filterLock是1號信號量,因此不會同時發生2次過濾操作。
EDIT2:
也是,在我onTextChanged我可以向你保證,我不會修改適配器有以任何方式要麼,我也不在從performFiltering()稱爲濾波器()方法
您不應該試圖停止getView()調用,而應該努力實現更好的過濾系統。發佈您的過濾操作代碼。 – Luksprog 2013-03-26 20:20:41
您已經使篩選操作複雜化了。由於不能同時使用'Filter'類來運行兩個過濾操作,所以鎖幾乎是無用的。唯一的同步需要在訪問數據列表時完成。另外,使列表的**副本不共享數據列表。 – Luksprog 2013-03-26 20:40:23
我可以發誓我跟蹤2線程通過執行過濾那裏在一起。這就是我爲什麼這樣做的原因。任何方式不傷我猜 – cdbeelala89 2013-03-26 21:01:27