Android TreeView效果實(shí)現(xiàn)方法(附demo源碼下載)
本文實(shí)例講述了Android TreeView效果實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:
應(yīng)該說(shuō)很多的操作系統(tǒng)上面都提供了TreeView空間,實(shí)現(xiàn)樹形結(jié)構(gòu),這個(gè)樹形結(jié)構(gòu)的應(yīng)用時(shí)很廣泛的,而Google開發(fā)Android的時(shí)候出于Android手機(jī)是觸摸屏幕的考慮,用手指操作樹形結(jié)構(gòu)很不方便,從這方面考慮沒(méi)有提供TreeView的空間,而是只是提供了一個(gè)ExpandableListView:android中的二級(jí)樹型Widget,雖然已經(jīng)能滿足不少的功能需求,例如書簽的功能就可以使用這個(gè)控件,但是隨著應(yīng)用的不斷增多這個(gè)就不能滿足要求了,例如pdf中左側(cè)的目錄的功能,就需要樹形結(jié)構(gòu)來(lái)實(shí)現(xiàn)。下面的這個(gè)應(yīng)用就是基于pdf左側(cè)的目錄結(jié)構(gòu)為原型寫的,那首先貼上效果圖:




這個(gè)的思路是:按照類似于“樹”的結(jié)構(gòu)組織數(shù)據(jù),界面上直接利用大家經(jīng)常用的listview實(shí)現(xiàn)的。下面這個(gè)是節(jié)點(diǎn)信息的類:
public class PDFOutlineElement {
private String id;//當(dāng)前節(jié)點(diǎn)的id
private String outlineTitle ;//節(jié)點(diǎn)上面顯示的信息
private boolean mhasParent ; //是否有父節(jié)點(diǎn)
private boolean mhasChild ;//是否有孩子節(jié)點(diǎn)
private String parent;//父節(jié)點(diǎn)的id
private int level;//當(dāng)前節(jié)點(diǎn)所在的層次
}
在這里我想解釋一下這個(gè)level,是很關(guān)鍵的,他表示的是當(dāng)前節(jié)點(diǎn)所在的層次,不要小看他,正是他幫助我們?cè)诮缑嫔巷@示出來(lái)了層次效果,其實(shí)這個(gè)樹形結(jié)構(gòu)并不是樹形結(jié)構(gòu),所有的數(shù)據(jù)都維護(hù)在一個(gè)ArrayList里面,某一個(gè)節(jié)點(diǎn)A下面有子節(jié)點(diǎn)B、C,其實(shí)A、B、C這三個(gè)節(jié)點(diǎn)在ArrayList里面是順序存放的,如果A的層次是level,那個(gè)他的子節(jié)點(diǎn)的層次是level+1,我們?cè)趃etView()的時(shí)候我們可以不借助系統(tǒng)自動(dòng)給我們畫上,而是可以自己指定他的位置holder.icon.setPadding(25 * (level + 1), holder.icon.getPaddingTop(), 0, holder.icon.getPaddingBottom());,這樣他的子節(jié)點(diǎn)便具有了縮進(jìn)的效果。
還有比較關(guān)鍵的點(diǎn)是如何實(shí)現(xiàn)“展開”和 “縮回”的效果,其實(shí)這個(gè)只不過(guò) 是當(dāng)單擊摸個(gè)節(jié)點(diǎn)的時(shí)候,如果這個(gè)節(jié)點(diǎn)下面有子節(jié)點(diǎn)而且是“縮回”的,就把他的所有的子節(jié)點(diǎn)都從那個(gè)ArrayList里面刪除調(diào),然后 notifyDataSetChanged(),同理就是“展開”的時(shí)候,就是在這個(gè)節(jié)點(diǎn)后面添加子節(jié)點(diǎn)到ArrayList里面,然后 notifyDataSetChanged()。
其實(shí)說(shuō)到這里大家應(yīng)該知道怎么做了,這個(gè)樹形結(jié)構(gòu)不是真樹,而就是一個(gè)ListView,通過(guò)往ArryList里面添加刪除數(shù)據(jù)控制信息,通過(guò)setPadding()實(shí)現(xiàn)縮進(jìn)
明白了這個(gè)思路,我把getView解釋一下,大家肯定能做出來(lái)
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.outline, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
int level = mfilelist.get(position).getLevel();//每次根據(jù)節(jié)點(diǎn)的層次繪制顯示的位置
holder.icon.setPadding(25 * (level + 1), holder.icon
.getPaddingTop(), 0, holder.icon.getPaddingBottom());
holder.icon.setVisibility(View.VISIBLE);
holder.text.setText(mfilelist.get(position).getOutlineTitle());
//如果有孩子而且當(dāng)前是不是展開的圖標(biāo)設(shè)置為“+”號(hào)的圖標(biāo)
if (mfilelist.get(position).isMhasChild()
&& (mfilelist.get(position).isExpanded() == false)) {
holder.icon.setImageBitmap(mIconCollapse);
} else if (mfilelist.get(position).isMhasChild()
&& (mfilelist.get(position).isExpanded() == true)) {
//如果有孩子而且當(dāng)前是不是展開的圖標(biāo)設(shè)置為“+”號(hào)的圖標(biāo)
holder.icon.setImageBitmap(mIconExpand);
} else if (!mfilelist.get(position).isMhasChild()){
holder.icon.setImageBitmap(mIconCollapse);
holder.icon.setVisibility(View.INVISIBLE);//這里不要設(shè)置為GONE,因?yàn)镚ONE不顯示而且不占位置的,而INVISIBLE是不顯示但是占位置的
}
return convertView;
}
完整實(shí)例代碼點(diǎn)擊此處本站下載。
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進(jìn)階教程》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- 自己實(shí)現(xiàn)的android樹控件treeview
- Android之IphoneTreeView帶組指示器的ExpandableListView效果
- Android實(shí)現(xiàn)樹形層級(jí)ListView
- Android提高之多級(jí)樹形菜單的實(shí)現(xiàn)方法
- Android設(shè)置TextView顯示指定個(gè)數(shù)字符,超過(guò)部分顯示...(省略號(hào))的方法
- Android重寫TextView實(shí)現(xiàn)文字整齊排版的方法(附demo源碼下載)
- Android實(shí)現(xiàn)ImageView圖片雙擊放大及縮小
- Android重寫View并自定義屬性實(shí)例分析
- Android獲取屏幕或View寬度和高度的方法
- Android中使用TextView實(shí)現(xiàn)圖文混排的方法
- Android手勢(shì)滑動(dòng)實(shí)現(xiàn)ImageView縮放圖片大小
相關(guān)文章
Android?DataBinding類關(guān)系深入探究
看了谷歌官方文章確實(shí)寫的太簡(jiǎn)略了,甚至看完之后有很多地方還不知道怎么回事兒或者怎么用,那么接下來(lái)我將通過(guò)文章全面介紹一下DataBinding類關(guān)系2022-11-11
Android實(shí)現(xiàn)上傳圖片至java服務(wù)器
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)上傳圖片至java服務(wù)器的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
android 調(diào)用系統(tǒng)的照相機(jī)和圖庫(kù)實(shí)例詳解
android手機(jī)有自帶的照相機(jī)和圖庫(kù),我們做的項(xiàng)目中有時(shí)用到上傳圖片到服務(wù)器,今天做了一個(gè)項(xiàng)目用到這個(gè)功能,所以把我的代碼記錄下來(lái)和大家分享,有需求的朋友可以參考下2012-12-12
Android Studio 安裝配置方法完整教程【小白秒懂】
這篇文章主要介紹了Android Studio 安裝配置方法完整教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-03-03
Android中判斷網(wǎng)絡(luò)連接是否可用及監(jiān)控網(wǎng)絡(luò)狀態(tài)
獲取網(wǎng)絡(luò)信息需要在AndroidManifest.xml文件中加入相應(yīng)的權(quán)限,接下來(lái)詳細(xì)介紹Android中判斷網(wǎng)絡(luò)連接是否可用及監(jiān)控網(wǎng)絡(luò)狀態(tài),感興趣的朋友可以參考下2012-12-12
Android Studio 升級(jí)到3.0后輸入法中文狀態(tài)下無(wú)法選詞的終極解決方案
這篇文章主要介紹了 AndroidStudio 升級(jí)到3.0后輸入法中文狀態(tài)下無(wú)法選詞的解決方案,需要的朋友可以參考下2017-11-11

