安卓多級列表簡單實現
二級listview我們可以使用expandablelistview,可以解決問題,但是要是多級的listview我們該怎麼辦。
網上有一個辦法就是expandablelistview巢狀expandablelistview,我曾經以為這個可以解決問題,但是在實際應用中發現,子expandablelistview是不能張開的,整個檢視的效果不是很好。
現在我來介紹一下我的方法。首先我們需要理解資料和檢視是分開的,拋開兩級、三級listview的束縛,介面是介面,資料是資料。我們只用最簡單的listview,然後我們不改變資料來源,那麼我們改變的是什麼了,通過索引尋找資料的方式。進一步說就是改變adapter中計算資料的數目方法和通過position找資料的方法。
這是一張樹形資料結構的圖,上面標註了每個索引。我們可以把它當作是完全展開,或者有些資料被隱藏了,我們不考慮隱藏的節點,它無關整個資料的多少和每個節點的索引。
下面是我的資料模型。
private Object obj;
public List<TreeNode> child;
public boolean isOpenChild;
obj代表自己的資料,child代表子類的資料,每個子類必須放在父類的child列表中去,isOpenChild是否開發子類,這個和adapter中資料的多少和尋找資料的方法有關。
下面是計算當前狀態下有多少資料,listview中顯示多少計算多少,會更具資料的isOpenChild計算。當前索引值的只計運算元類和子類的子類的資料,不計算自身。
// 只計運算元類和子類的直接子類、間接子類的數目 public int getChildSize() { int size = 0; // 判斷子類集合物件是否為空 if (child == null) { System.out.println("子類物件為空" + obj.toString()); return size; } // 子類集合大小為零 或者 不開放子類 if (child.size() == 0 || isOpenChild == false) { System.out.println("子類物件數目為空" + obj.toString()); return size; } for (int i = 0; i < child.size(); i++) { // 計算特定索引值的子類的所包含的大小 // 1 代表子類 child.get(i).getSize()是子類的所包含的數目 size += child.get(i).getChildSize() + 1; } return size; }
下面是通過position尋找子類的方法。
假如上面的資料的第一個結點的子節點被隱藏了,那麼樹形資料的數目變成了5,而有些結點的索引也發生了改變。
我們根據索引值i進行尋找資料,如果i==3:
1.第0個節點不對,那進入第一個子樹,i需要減少1。 i = 2
2.第1個節點的子結點為零, 2 - 0 -1 > 0 進入第2個節點, i = i - 1 =1;
3.第二個節點的子樹數目為 2,1 - 2 - 1 < 0 進入第2個節點的第一個子節點, i = i - 1 =0;
3.第2個節點的第一個子節點 i = 0; 找到了。
原則:1.判斷i==0? 等於0說明找到了;
2.進入子樹 i--;
3.進入兄弟減去子樹的數目(包括子樹和子樹下面的所有節點);
/**
* 通過索引值尋找子類資訊
*
* @param index
* @return
*/
public TreeNode findItemById(int index) {
int secondIndex = index;
int size = child.size();
TreeNode node = null;
for (int i = 0; i < size; i++) {
// 判斷當前索引是否為0
if (secondIndex == 0) {
node = child.get(i);
break;
}
// 判斷第二索引值和第i項item的子類數目
int reduce = secondIndex - child.get(i).getChildSize() - 1;
if (reduce >= 0) {
// 如果大於,繼續尋找
secondIndex = reduce;
} else {
// 如果小於,尋找子類的子類
node = child.get(i).findItemById(secondIndex - 1);
break;
}
}
return node;
}
這兩個方法已經介紹完畢,它們會被運用與adpater的getItem()和getCount()兩個函式中去,listview的getview改怎麼寫怎麼寫,不用管多少級。當你點選的時候,改變當前item對應資料的isOpenChild的值,然後重新整理一下列表。
歡迎大家多評論、多交流共同進步 原始碼