Android 多层树完美实现

 效果:


main.xml:
Java代码
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="horizontal" android:layout_width="fill_parent"  
  4.     android:layout_height="wrap_content">   
  5.     <ImageView android:id="@+id/icon" android:layout_width="wrap_content"  
  6.         android:layout_height="fill_parent" android:layout_marginRight="6.0dip"  
  7.         android:layout_alignParentTop="true" android:layout_alignParentBottom="true" />   
  8.     <!--<TextView android:id="@+id/text" android:layout_gravity="center_vertical"    
  9.         android:layout_weight="1.0" android:layout_height="wrap_content" android:layout_width="0dip"    
  10.         android:textAppearance="?android:attr/textAppearanceMedium" android:singleLine="true"    
  11.         android:textColor="#ffffff" /> -->   
  12.     <TextView android:textAppearance="?android:textAppearanceMedium"  
  13.         android:gravity="center_vertical" android:id="@+id/text"  
  14.         android:textColor="#ffffff" android:layout_width="fill_parent"  
  15.         android:layout_height="fill_parent" android:singleLine="true"  
  16.         android:layout_toRightOf="@id/icon" android:layout_alignParentTop="true"  
  17.         android:layout_alignParentBottom="true" />   
  18. </RelativeLayout>  
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="horizontal" android:layout_width="fill_parent"
	android:layout_height="wrap_content">
	<ImageView android:id="@+id/icon" android:layout_width="wrap_content"
		android:layout_height="fill_parent" android:layout_marginRight="6.0dip"
		android:layout_alignParentTop="true" android:layout_alignParentBottom="true" />
	<!--<TextView android:id="@+id/text" android:layout_gravity="center_vertical" 
		android:layout_weight="1.0" android:layout_height="wrap_content" android:layout_width="0dip" 
		android:textAppearance="?android:attr/textAppearanceMedium" android:singleLine="true" 
		android:textColor="#ffffff" /> -->
	<TextView android:textAppearance="?android:textAppearanceMedium"
		android:gravity="center_vertical" android:id="@+id/text"
		android:textColor="#ffffff" android:layout_width="fill_parent"
		android:layout_height="fill_parent" android:singleLine="true"
		android:layout_toRightOf="@id/icon" android:layout_alignParentTop="true"
		android:layout_alignParentBottom="true" />
</RelativeLayout>


TreeElement.java:
Java代码
  1. package com.iaiai;   
  2.   
  3. import java.util.ArrayList;   
  4.   
  5. /**  
  6.  *   
  7.  * <p>  
  8.  * Title: TreeElement.java  
  9.  * </p>  
  10.  * <p>  
  11.  * E-Mail: 176291935@qq.com  
  12.  * </p>  
  13.  * <p>  
  14.  * QQ: 176291935  
  15.  * </p>  
  16.  * <p>  
  17.  * Http: iaiai.iteye.com  
  18.  * </p>  
  19.  * <p>  
  20.  * Create time: 2011-8-20  
  21.  * </p>  
  22.  *   
  23.  * @author 丸子  
  24.  * @version 0.0.1  
  25.  */  
  26. public class TreeElement {   
  27.   
  28.     private String id;   
  29.     private String outlineTitle;   
  30.     private boolean mhasParent;   
  31.     private boolean mhasChild;   
  32.     private TreeElement parent;   
  33.     private int level;   
  34.     private ArrayList<TreeElement> childList = new ArrayList<TreeElement>();   
  35.   
  36.     public String getId() {   
  37.         return id;   
  38.     }   
  39.   
  40.     public void setId(String id) {   
  41.         this.id = id;   
  42.     }   
  43.   
  44.     public String getOutlineTitle() {   
  45.         return outlineTitle;   
  46.     }   
  47.   
  48.     public void setOutlineTitle(String outlineTitle) {   
  49.         this.outlineTitle = outlineTitle;   
  50.     }   
  51.   
  52.     public boolean isMhasParent() {   
  53.         return mhasParent;   
  54.     }   
  55.   
  56.     public void setMhasParent(boolean mhasParent) {   
  57.         this.mhasParent = mhasParent;   
  58.     }   
  59.   
  60.     public boolean isMhasChild() {   
  61.         return mhasChild;   
  62.     }   
  63.   
  64.     public void setMhasChild(boolean mhasChild) {   
  65.         this.mhasChild = mhasChild;   
  66.     }   
  67.   
  68.     public int getLevel() {   
  69.         return level;   
  70.     }   
  71.   
  72.     public void setLevel(int level) {   
  73.         this.level = level;   
  74.     }   
  75.   
  76.     public boolean isExpanded() {   
  77.         return expanded;   
  78.     }   
  79.   
  80.     public void setExpanded(boolean expanded) {   
  81.         this.expanded = expanded;   
  82.     }   
  83.   
  84.     public ArrayList<TreeElement> getChildList() {   
  85.         return childList;   
  86.     }   
  87.   
  88.     public TreeElement getParent() {   
  89.         return parent;   
  90.     }   
  91.   
  92.     public void setParent(TreeElement parent) {   
  93.         this.parent = parent;   
  94.     }   
  95.   
  96.     // private OutlineElement outlineElement;   
  97.     private boolean expanded;   
  98.   
  99.     public void addChild(TreeElement c) {   
  100.         this.childList.add(c);   
  101.         this.mhasParent = false;   
  102.         this.mhasChild = true;   
  103.         c.parent = this;   
  104.         c.level = this.level + 1;   
  105.   
  106.     }   
  107.   
  108.     public TreeElement(String id, String title) {   
  109.         super();   
  110.         this.id = id;   
  111.         this.outlineTitle = title;   
  112.         this.level = 0;   
  113.         this.mhasParent = true;   
  114.         this.mhasChild = false;   
  115.         this.parent = null;   
  116.     }   
  117.   
  118.     public TreeElement(String id, String outlineTitle, boolean mhasParent,   
  119.             boolean mhasChild, TreeElement parent, int level, boolean expanded) {   
  120.         super();   
  121.         this.id = id;   
  122.         this.outlineTitle = outlineTitle;   
  123.         this.mhasParent = mhasParent;   
  124.         this.mhasChild = mhasChild;   
  125.         this.parent = parent;   
  126.         if (parent != null) {   
  127.             this.parent.getChildList().add(this);   
  128.         }   
  129.         this.level = level;   
  130.         this.expanded = expanded;   
  131.     }   
  132.   
  133. }  
package com.iaiai;

import java.util.ArrayList;

/**
 * 
 * <p>
 * Title: TreeElement.java
 * </p>
 * <p>
 * E-Mail: 176291935@qq.com
 * </p>
 * <p>
 * QQ: 176291935
 * </p>
 * <p>
 * Http: iaiai.iteye.com
 * </p>
 * <p>
 * Create time: 2011-8-20
 * </p>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class TreeElement {

	private String id;
	private String outlineTitle;
	private boolean mhasParent;
	private boolean mhasChild;
	private TreeElement parent;
	private int level;
	private ArrayList<TreeElement> childList = new ArrayList<TreeElement>();

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getOutlineTitle() {
		return outlineTitle;
	}

	public void setOutlineTitle(String outlineTitle) {
		this.outlineTitle = outlineTitle;
	}

	public boolean isMhasParent() {
		return mhasParent;
	}

	public void setMhasParent(boolean mhasParent) {
		this.mhasParent = mhasParent;
	}

	public boolean isMhasChild() {
		return mhasChild;
	}

	public void setMhasChild(boolean mhasChild) {
		this.mhasChild = mhasChild;
	}

	public int getLevel() {
		return level;
	}

	public void setLevel(int level) {
		this.level = level;
	}

	public boolean isExpanded() {
		return expanded;
	}

	public void setExpanded(boolean expanded) {
		this.expanded = expanded;
	}

	public ArrayList<TreeElement> getChildList() {
		return childList;
	}

	public TreeElement getParent() {
		return parent;
	}

	public void setParent(TreeElement parent) {
		this.parent = parent;
	}

	// private OutlineElement outlineElement;
	private boolean expanded;

	public void addChild(TreeElement c) {
		this.childList.add(c);
		this.mhasParent = false;
		this.mhasChild = true;
		c.parent = this;
		c.level = this.level + 1;

	}

	public TreeElement(String id, String title) {
		super();
		this.id = id;
		this.outlineTitle = title;
		this.level = 0;
		this.mhasParent = true;
		this.mhasChild = false;
		this.parent = null;
	}

	public TreeElement(String id, String outlineTitle, boolean mhasParent,
			boolean mhasChild, TreeElement parent, int level, boolean expanded) {
		super();
		this.id = id;
		this.outlineTitle = outlineTitle;
		this.mhasParent = mhasParent;
		this.mhasChild = mhasChild;
		this.parent = parent;
		if (parent != null) {
			this.parent.getChildList().add(this);
		}
		this.level = level;
		this.expanded = expanded;
	}

}


TreeView.java:
Java代码
  1. package com.iaiai;   
  2.   
  3. import java.util.ArrayList;   
  4. import java.util.List;   
  5.   
  6. import android.app.ListActivity;   
  7. import android.content.Context;   
  8. import android.graphics.Bitmap;   
  9. import android.graphics.BitmapFactory;   
  10. import android.os.Bundle;   
  11. import android.util.Log;   
  12. import android.view.LayoutInflater;   
  13. import android.view.View;   
  14. import android.view.ViewGroup;   
  15. import android.widget.ArrayAdapter;   
  16. import android.widget.ImageView;   
  17. import android.widget.ListView;   
  18. import android.widget.TextView;   
  19. import android.widget.Toast;   
  20.   
  21. /**  
  22.  *   
  23.  * <p>  
  24.  * Title: TreeView.java  
  25.  * </p>  
  26.  * <p>  
  27.  * E-Mail: 176291935@qq.com  
  28.  * </p>  
  29.  * <p>  
  30.  * QQ: 176291935  
  31.  * </p>  
  32.  * <p>  
  33.  * Http: iaiai.iteye.com  
  34.  * </p>  
  35.  * <p>  
  36.  * Create time: 2011-8-20  
  37.  * </p>  
  38.  *   
  39.  * @author 丸子  
  40.  * @version 0.0.1  
  41.  */  
  42. public class TreeView extends ListActivity {   
  43.     private ArrayList<TreeElement> mPdfOutlinesCount = new ArrayList<TreeElement>();   
  44.     private TreeViewAdapter treeViewAdapter = null;   
  45.   
  46.     /** Called when the activity is first created. */  
  47.     @Override  
  48.     public void onCreate(Bundle savedInstanceState) {   
  49.         super.onCreate(savedInstanceState);   
  50.   
  51.         initialData();   
  52.         treeViewAdapter = new TreeViewAdapter(this, R.layout.main,   
  53.                 mPdfOutlinesCount);   
  54.         setListAdapter(treeViewAdapter);   
  55.         registerForContextMenu(getListView());   
  56.     }   
  57.   
  58.     private void initialData() {   
  59.         TreeElement element1 = new TreeElement("01""关键类");   
  60.         TreeElement element2 = new TreeElement("02""应用程序组件");   
  61.         TreeElement element3 = new TreeElement("03""Activity和任务");   
  62.         TreeElement element4 = new TreeElement("04""激活组件:intent");   
  63.         TreeElement element5 = new TreeElement("05""关闭组件");   
  64.         TreeElement element6 = new TreeElement("06""manifest文件");   
  65.         TreeElement element7 = new TreeElement("07""Intent过滤器");   
  66.         TreeElement element8 = new TreeElement("08""Affinity(吸引力)和新任务");   
  67.         TreeElement element9 = new TreeElement("09""加载模式");   
  68.         TreeElement element10 = new TreeElement("10""加载模式孩子1");   
  69.         TreeElement element11 = new TreeElement("11""加载模式孩子2");   
  70.         TreeElement element12 = new TreeElement("12""加载模式孩子2的孩子1");   
  71.         TreeElement element13 = new TreeElement("13""加载模式孩子2的孩子2");   
  72.         TreeElement element14 = new TreeElement("14""加载模式孩子1的孩子1");   
  73.         TreeElement element15 = new TreeElement("15""加载模式孩子1的孩子2");   
  74.         TreeElement element16 = new TreeElement("16""加载模式孩子1的孩子3");   
  75.         TreeElement element17 = new TreeElement("17""加载模式孩子1的孩子4");   
  76.         TreeElement element18 = new TreeElement("18""加载模式孩子1的孩子5");   
  77.         TreeElement element19 = new TreeElement("19""加载模式孩子1的孩子6");   
  78.   
  79.         mPdfOutlinesCount.add(element1);   
  80.         mPdfOutlinesCount.add(element2);   
  81.         mPdfOutlinesCount.add(element9);   
  82.         element2.addChild(element3);   
  83.         element1.addChild(element4);   
  84.         element1.addChild(element5);   
  85.         element1.addChild(element6);   
  86.         element1.addChild(element7);   
  87.         element7.addChild(element8);   
  88.         element9.addChild(element10);   
  89.         element9.addChild(element11);   
  90.         element11.addChild(element12);   
  91.         element11.addChild(element13);   
  92.         element10.addChild(element14);   
  93.         element10.addChild(element15);   
  94.         element10.addChild(element16);   
  95.         element10.addChild(element17);   
  96.         element10.addChild(element18);   
  97.         element10.addChild(element19);   
  98.   
  99.     }   
  100.   
  101.     @SuppressWarnings("unchecked")   
  102.     private class TreeViewAdapter extends ArrayAdapter {   
  103.         public TreeViewAdapter(Context context, int textViewResourceId,   
  104.                 List objects) {   
  105.             super(context, textViewResourceId, objects);   
  106.             mInflater = LayoutInflater.from(context);   
  107.             mfilelist = objects;   
  108.             mIconCollapse = BitmapFactory.decodeResource(   
  109.                     context.getResources(), R.drawable.outline_list_collapse);   
  110.             mIconExpand = BitmapFactory.decodeResource(context.getResources(),   
  111.                     R.drawable.outline_list_expand);   
  112.         }   
  113.   
  114.         private LayoutInflater mInflater;   
  115.         private List<TreeElement> mfilelist;   
  116.         private Bitmap mIconCollapse;   
  117.         private Bitmap mIconExpand;   
  118.   
  119.         public int getCount() {   
  120.             return mfilelist.size();   
  121.         }   
  122.   
  123.         public Object getItem(int position) {   
  124.             return position;   
  125.         }   
  126.   
  127.         public long getItemId(int position) {   
  128.             return position;   
  129.         }   
  130.   
  131.         public View getView(int position, View convertView, ViewGroup parent) {   
  132.             ViewHolder holder;   
  133.             /* if (convertView == null) { */  
  134.             convertView = mInflater.inflate(R.layout.main, null);   
  135.             holder = new ViewHolder();   
  136.             holder.text = (TextView) convertView.findViewById(R.id.text);   
  137.             holder.icon = (ImageView) convertView.findViewById(R.id.icon);   
  138.             convertView.setTag(holder);   
  139.             /*  
  140.              * } else { holder = (ViewHolder) convertView.getTag(); }  
  141.              */  
  142.   
  143.             final TreeElement obj = mfilelist.get(position);   
  144.   
  145.             holder.text.setOnClickListener(new View.OnClickListener() {   
  146.   
  147.                 @Override  
  148.                 public void onClick(View v) {   
  149.                     Log.i("TreeView""obj.id:" + obj.getId());   
  150.                 }   
  151.             });   
  152.   
  153.             int level = obj.getLevel();   
  154.             holder.icon.setPadding(25 * (level + 1),   
  155.                     holder.icon.getPaddingTop(), 0,   
  156.                     holder.icon.getPaddingBottom());   
  157.             holder.text.setText(obj.getOutlineTitle());   
  158.             if (obj.isMhasChild() && (obj.isExpanded() == false)) {   
  159.                 holder.icon.setImageBitmap(mIconCollapse);   
  160.             } else if (obj.isMhasChild() && (obj.isExpanded() == true)) {   
  161.                 holder.icon.setImageBitmap(mIconExpand);   
  162.             } else if (!obj.isMhasChild()) {   
  163.                 holder.icon.setImageBitmap(mIconCollapse);   
  164.                 holder.icon.setVisibility(View.INVISIBLE);   
  165.             }   
  166.             return convertView;   
  167.         }   
  168.   
  169.         class ViewHolder {   
  170.             TextView text;   
  171.             ImageView icon;   
  172.   
  173.         }   
  174.     }   
  175.   
  176.     @Override  
  177.     protected void onListItemClick(ListView l, View v, int position, long id) {   
  178.         super.onListItemClick(l, v, position, id);   
  179.         Log.i("TreeView""position:" + position);   
  180.         if (!mPdfOutlinesCount.get(position).isMhasChild()) {   
  181.             Toast.makeText(this, mPdfOutlinesCount.get(position)   
  182.                     .getOutlineTitle(), 2000);   
  183.             /*  
  184.              * int pageNumber; Intent i = getIntent(); element element =  
  185.              * mPdfOutlinesCount .get(position); pageNumber =  
  186.              * element.getOutlineElement().pageNumber; if (pageNumber <= 0) {  
  187.              * String name = element.getOutlineElement().destName; pageNumber =  
  188.              * idocviewer.getPageNumberForNameForOutline(name);  
  189.              * element.getOutlineElement().pageNumber = pageNumber;  
  190.              * element.getOutlineElement().destName = null; }  
  191.              * i.putExtra("PageNumber", pageNumber); setResult(RESULT_OK, i);  
  192.              * finish();  
  193.              */  
  194.   
  195.             return;   
  196.         }   
  197.   
  198.         if (mPdfOutlinesCount.get(position).isExpanded()) {   
  199.             mPdfOutlinesCount.get(position).setExpanded(false);   
  200.             TreeElement element = mPdfOutlinesCount.get(position);   
  201.             ArrayList<TreeElement> temp = new ArrayList<TreeElement>();   
  202.   
  203.             for (int i = position + 1; i < mPdfOutlinesCount.size(); i++) {   
  204.                 if (element.getLevel() >= mPdfOutlinesCount.get(i).getLevel()) {   
  205.                     break;   
  206.                 }   
  207.                 temp.add(mPdfOutlinesCount.get(i));   
  208.             }   
  209.   
  210.             mPdfOutlinesCount.removeAll(temp);   
  211.   
  212.             treeViewAdapter.notifyDataSetChanged();   
  213.             /*  
  214.              * fileExploreAdapter = new TreeViewAdapter(this, R.layout.outline,  
  215.              * mPdfOutlinesCount);  
  216.              */  
  217.   
  218.             // setListAdapter(fileExploreAdapter);   
  219.   
  220.         } else {   
  221.             TreeElement obj = mPdfOutlinesCount.get(position);   
  222.             obj.setExpanded(true);   
  223.             int level = obj.getLevel();   
  224.             int nextLevel = level + 1;   
  225.   
  226.             for (TreeElement element : obj.getChildList()) {   
  227.                 element.setLevel(nextLevel);   
  228.                 element.setExpanded(false);   
  229.                 mPdfOutlinesCount.add(position + 1, element);   
  230.   
  231.             }   
  232.             treeViewAdapter.notifyDataSetChanged();   
  233.             /*  
  234.              * fileExploreAdapter = new TreeViewAdapter(this, R.layout.outline,  
  235.              * mPdfOutlinesCount);  
  236.              */  
  237.   
  238.             // setListAdapter(fileExploreAdapter);   
  239.         }   
  240.     }   
  241.   
  242. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值