編輯:關於Android編程
private class SimpleListIterator implements Iterator {
//游標的位置,初始為 -1
int pos = -1;
//用來判斷是否 fail-fast 的變量
int expectedModCount;
//記錄上次迭代的位置
int lastPosition = -1;
SimpleListIterator() {
expectedModCount = modCount;
}
//當游標沒有跑到最後一個元素後面時 hasNext 返回 true
public boolean hasNext() {
return pos + 1 < size();
}
//獲取下一個元素
public E next() {
if (expectedModCount == modCount) {
try {
//獲取游標後面的元素,具體子類有具體實現
E result = get(pos + 1);
//更新
lastPosition = ++pos;
return result;
} catch (IndexOutOfBoundsException e) {
throw new NoSuchElementException();
}
}
//當迭代時修改元素,就會報這個錯,上篇文章介紹過解決辦法~
throw new ConcurrentModificationException();
}
//刪除上次迭代操作的元素
public void remove() {
//還沒進行迭代操作就會報這個錯
if (this.lastPosition == -1) {
throw new IllegalStateException();
}
if (expectedModCount != modCount) {
throw new ConcurrentModificationException();
}
try {
//調用子類實現的刪除操作
AbstractList.this.remove(lastPosition);
} catch (IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
expectedModCount = modCount;
if (pos == lastPosition) {
pos--;
}
//每次刪除後都會還原為 -1,也就是說我們迭代一次後只能 remove 一次,再 remove 就會報錯
lastPosition = -1;
}
}
了解了 SimpleListIterator 後我們看下 FullListIterator 的具體實現:
private final class FullListIterator extends SimpleListIterator implements ListIterator {
//根據 start 指定游標位置
FullListIterator(int start) {
if (start >= 0 && start <= size()) {
pos = start - 1;
} else {
throw new IndexOutOfBoundsException();
}
}
//在游標前面添加元素
public void add(E object) {
if (expectedModCount == modCount) {
try {
//調用子類的添加操作,ArrayList, LinkedList,Vector 的添加操作實現有所不同
AbstractList.this.add(pos + 1, object);
} catch (IndexOutOfBoundsException e) {
throw new NoSuchElementException();
}
//游標後移一位
pos++;
//!注意! 添加後 上次迭代位置又變回 -1 了,說明 add 後調用 remove, set 會有問題!
lastPosition = -1;
if (modCount != expectedModCount) {
expectedModCount = modCount;
}
} else {
throw new ConcurrentModificationException();
}
}
//當游標不在初始位置(-1)時返回true
public boolean hasPrevious() {
return pos >= 0;
}
//游標後面的元素索引,就是游標 +1
public int nextIndex() {
return pos + 1;
}
//游標前面一個元素
public E previous() {
if (expectedModCount == modCount) {
try {
E result = get(pos);
lastPosition = pos;
pos--;
return result;
} catch (IndexOutOfBoundsException e) {
throw new NoSuchElementException();
}
}
throw new ConcurrentModificationException();
}
//游標前面元素的索引,就是游標的位置,有點暈的看開頭那幾張圖
public int previousIndex() {
return pos;
}
//更新之前迭代的元素為 object
public void set(E object) {
if (expectedModCount == modCount) {
try {
//調用子類的set
AbstractList.this.set(lastPosition, object);
} catch (IndexOutOfBoundsException e) {
throw new IllegalStateException();
}
} else {
throw new ConcurrentModificationException();
}
}
}
可以看到 SimpleListIterator 的主要操作最後都交給子類來實現,List 的子類 ArrayList, LinkedList, Vector 由於底層實現原理不同(數組,雙向鏈表),具體操作類實現有所不同。
等接下來分析到具體子類再看相關實現吧。
照片牆這種功能現在應該算是挺常見了,在很多應用中你都可以經常看到照片牆的身影。它的設計思路其實也非常簡單,用一個GridView控件當作“牆”,然後隨著GridView的
(一)概述本節引言:在上一節結束後意味著Android的四大組件我們都已經學習完畢了~,而本節我們要學習的是四大組件間的 樞紐——Intent(意
寫在前面的話: 看到標題這麼長可能大家有點抓狂了,是的,我在剛剛學這一篇的時候有一些不理解,什麼是布局泵?編輯每一個模板然後什麼是自定義Adapter?下面我們開始學習這
在Android native編寫代碼時,會經常接觸到sp、wp,sp並不是smart pointer的意思,而是strong point;wp就是weak point