Android 多层树完美实现
效果:
main.xml:
<?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:
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:
package com.iaiai;import java.util.ArrayList;import java.util.List;import android.app.ListActivity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;/** * * <p> * Title: TreeView.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 TreeView extends ListActivity {private ArrayList<TreeElement> mPdfOutlinesCount = new ArrayList<TreeElement>();private TreeViewAdapter treeViewAdapter = null;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);initialData();treeViewAdapter = new TreeViewAdapter(this, R.layout.main,mPdfOutlinesCount);setListAdapter(treeViewAdapter);registerForContextMenu(getListView());}private void initialData() {TreeElement element1 = new TreeElement("01", "关键类");TreeElement element2 = new TreeElement("02", "应用程序组件");TreeElement element3 = new TreeElement("03", "Activity和任务");TreeElement element4 = new TreeElement("04", "激活组件:intent");TreeElement element5 = new TreeElement("05", "关闭组件");TreeElement element6 = new TreeElement("06", "manifest文件");TreeElement element7 = new TreeElement("07", "Intent过滤器");TreeElement element8 = new TreeElement("08", "Affinity(吸引力)和新任务");TreeElement element9 = new TreeElement("09", "加载模式");TreeElement element10 = new TreeElement("10", "加载模式孩子1");TreeElement element11 = new TreeElement("11", "加载模式孩子2");TreeElement element12 = new TreeElement("12", "加载模式孩子2的孩子1");TreeElement element13 = new TreeElement("13", "加载模式孩子2的孩子2");TreeElement element14 = new TreeElement("14", "加载模式孩子1的孩子1");TreeElement element15 = new TreeElement("15", "加载模式孩子1的孩子2");TreeElement element16 = new TreeElement("16", "加载模式孩子1的孩子3");TreeElement element17 = new TreeElement("17", "加载模式孩子1的孩子4");TreeElement element18 = new TreeElement("18", "加载模式孩子1的孩子5");TreeElement element19 = new TreeElement("19", "加载模式孩子1的孩子6");mPdfOutlinesCount.add(element1);mPdfOutlinesCount.add(element2);mPdfOutlinesCount.add(element9);element2.addChild(element3);element1.addChild(element4);element1.addChild(element5);element1.addChild(element6);element1.addChild(element7);element7.addChild(element8);element9.addChild(element10);element9.addChild(element11);element11.addChild(element12);element11.addChild(element13);element10.addChild(element14);element10.addChild(element15);element10.addChild(element16);element10.addChild(element17);element10.addChild(element18);element10.addChild(element19);}@SuppressWarnings("unchecked")private class TreeViewAdapter extends ArrayAdapter {public TreeViewAdapter(Context context, int textViewResourceId,List objects) {super(context, textViewResourceId, objects);mInflater = LayoutInflater.from(context);mfilelist = objects;mIconCollapse = BitmapFactory.decodeResource(context.getResources(), R.drawable.outline_list_collapse);mIconExpand = BitmapFactory.decodeResource(context.getResources(),R.drawable.outline_list_expand);}private LayoutInflater mInflater;private List<TreeElement> mfilelist;private Bitmap mIconCollapse;private Bitmap mIconExpand;public int getCount() {return mfilelist.size();}public Object getItem(int position) {return position;}public long getItemId(int position) {return position;}public View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;/* if (convertView == null) { */convertView = mInflater.inflate(R.layout.main, 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(); } */final TreeElement obj = mfilelist.get(position);holder.text.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Log.i("TreeView", "obj.id:" + obj.getId());}});int level = obj.getLevel();holder.icon.setPadding(25 * (level + 1),holder.icon.getPaddingTop(), 0,holder.icon.getPaddingBottom());holder.text.setText(obj.getOutlineTitle());if (obj.isMhasChild() && (obj.isExpanded() == false)) {holder.icon.setImageBitmap(mIconCollapse);} else if (obj.isMhasChild() && (obj.isExpanded() == true)) {holder.icon.setImageBitmap(mIconExpand);} else if (!obj.isMhasChild()) {holder.icon.setImageBitmap(mIconCollapse);holder.icon.setVisibility(View.INVISIBLE);}return convertView;}class ViewHolder {TextView text;ImageView icon;}}@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {super.onListItemClick(l, v, position, id);Log.i("TreeView", "position:" + position);if (!mPdfOutlinesCount.get(position).isMhasChild()) {Toast.makeText(this, mPdfOutlinesCount.get(position).getOutlineTitle(), 2000);/* * int pageNumber; Intent i = getIntent(); element element = * mPdfOutlinesCount .get(position); pageNumber = * element.getOutlineElement().pageNumber; if (pageNumber <= 0) { * String name = element.getOutlineElement().destName; pageNumber = * idocviewer.getPageNumberForNameForOutline(name); * element.getOutlineElement().pageNumber = pageNumber; * element.getOutlineElement().destName = null; } * i.putExtra("PageNumber", pageNumber); setResult(RESULT_OK, i); * finish(); */return;}if (mPdfOutlinesCount.get(position).isExpanded()) {mPdfOutlinesCount.get(position).setExpanded(false);TreeElement element = mPdfOutlinesCount.get(position);ArrayList<TreeElement> temp = new ArrayList<TreeElement>();for (int i = position + 1; i < mPdfOutlinesCount.size(); i++) {if (element.getLevel() >= mPdfOutlinesCount.get(i).getLevel()) {break;}temp.add(mPdfOutlinesCount.get(i));}mPdfOutlinesCount.removeAll(temp);treeViewAdapter.notifyDataSetChanged();/* * fileExploreAdapter = new TreeViewAdapter(this, R.layout.outline, * mPdfOutlinesCount); */// setListAdapter(fileExploreAdapter);} else {TreeElement obj = mPdfOutlinesCount.get(position);obj.setExpanded(true);int level = obj.getLevel();int nextLevel = level + 1;for (TreeElement element : obj.getChildList()) {element.setLevel(nextLevel);element.setExpanded(false);mPdfOutlinesCount.add(position + 1, element);}treeViewAdapter.notifyDataSetChanged();/* * fileExploreAdapter = new TreeViewAdapter(this, R.layout.outline, * mPdfOutlinesCount); */// setListAdapter(fileExploreAdapter);}}}下面是用到的两张图片:
