国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android TreeView效果實現方法(附demo源碼下載)

2020-04-11 10:46:38
字體:
來源:轉載
供稿:網友

本文實例講述了Android TreeView效果實現方法。分享給大家供大家參考,具體如下:

應該說很多的操作系統上面都提供了TreeView空間,實現樹形結構,這個樹形結構的應用時很廣泛的,而Google開發Android的時候出于Android手機是觸摸屏幕的考慮,用手指操作樹形結構很不方便,從這方面考慮沒有提供TreeView的空間,而是只是提供了一個ExpandableListView:android中的二級樹型Widget,雖然已經能滿足不少的功能需求,例如書簽的功能就可以使用這個控件,但是隨著應用的不斷增多這個就不能滿足要求了,例如pdf中左側的目錄的功能,就需要樹形結構來實現。下面的這個應用就是基于pdf左側的目錄結構為原型寫的,那首先貼上效果圖:

這個的思路是:按照類似于“樹”的結構組織數據,界面上直接利用大家經常用的listview實現的。下面這個是節點信息的類:

public class PDFOutlineElement {  private String id;//當前節點的id  private String outlineTitle ;//節點上面顯示的信息  private boolean mhasParent ; //是否有父節點  private boolean mhasChild ;//是否有孩子節點  private String parent;//父節點的id  private int level;//當前節點所在的層次}

在這里我想解釋一下這個level,是很關鍵的,他表示的是當前節點所在的層次,不要小看他,正是他幫助我們在界面上顯示出來了層次效果,其實這個樹形結構并不是樹形結構,所有的數據都維護在一個ArrayList里面,某一個節點A下面有子節點B、C,其實A、B、C這三個節點在ArrayList里面是順序存放的,如果A的層次是level,那個他的子節點的層次是level+1,我們在getView()的時候我們可以不借助系統自動給我們畫上,而是可以自己指定他的位置holder.icon.setPadding(25 * (level + 1), holder.icon.getPaddingTop(), 0, holder.icon.getPaddingBottom());,這樣他的子節點便具有了縮進的效果。

還有比較關鍵的點是如何實現“展開”和 “縮回”的效果,其實這個只不過 是當單擊摸個節點的時候,如果這個節點下面有子節點而且是“縮回”的,就把他的所有的子節點都從那個ArrayList里面刪除調,然后 notifyDataSetChanged(),同理就是“展開”的時候,就是在這個節點后面添加子節點到ArrayList里面,然后 notifyDataSetChanged()。

其實說到這里大家應該知道怎么做了,這個樹形結構不是真樹,而就是一個ListView,通過往ArryList里面添加刪除數據控制信息,通過setPadding()實現縮進

明白了這個思路,我把getView解釋一下,大家肯定能做出來

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();//每次根據節點的層次繪制顯示的位置  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());       //如果有孩子而且當前是不是展開的圖標設置為“+”號的圖標  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)) {       //如果有孩子而且當前是不是展開的圖標設置為“+”號的圖標    holder.icon.setImageBitmap(mIconExpand);  } else if (!mfilelist.get(position).isMhasChild()){    holder.icon.setImageBitmap(mIconCollapse);    holder.icon.setVisibility(View.INVISIBLE);//這里不要設置為GONE,因為GONE不顯示而且不占位置的,而INVISIBLE是不顯示但是占位置的  }  return convertView;}

完整實例代碼點擊此處本站下載

更多關于Android相關內容感興趣的讀者可查看本站專題:《Android開發入門與進階教程》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結》、《Android視圖View技巧總結》、《Android布局layout技巧總結》及《Android控件用法總結

希望本文所述對大家Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 伽师县| 神农架林区| 香格里拉县| 舟曲县| 新巴尔虎右旗| 渭南市| 泸定县| 南溪县| 鲁山县| 南通市| 东丽区| 平山县| 通河县| 平顶山市| 苍山县| 双峰县| 宜都市| 永和县| 梨树县| 安新县| 石柱| 云阳县| 汶上县| 青海省| 东山县| 鱼台县| 京山县| 南郑县| 洞头县| 田东县| 措美县| 钟山县| 九龙坡区| 大方县| 宜宾市| 丽江市| 淮安市| 瓮安县| 凌海市| 松桃| 滨海县|