1. 程式人生 > >安卓多級列表簡單實現

安卓多級列表簡單實現

      二級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的值,然後重新整理一下列表。


歡迎大家多評論、多交流共同進步
原始碼