锁定老帖子 主题:Android 多层树完美实现
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2011-08-20
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. */ @Override public 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() { @Override public 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; } } @Override protected 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); } } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-08-22
丸子,竟然看到你发帖了,呵呵...
|
|
返回顶楼 | |
发表时间:2011-08-22
xuhuiflygo 写道 丸子,竟然看到你发帖了,呵呵...
啊~~~~~~~~~~`你是哪个群里的? |
|
返回顶楼 | |
发表时间:2011-08-22
核心代码 holder.icon.setPadding(25 * (level + 1),
holder.icon.getPaddingTop(), 0, holder.icon.getPaddingBottom()); |
|
返回顶楼 | |
发表时间:2011-08-22
转载要说明出处。
|
|
返回顶楼 | |
发表时间:2011-08-23
很想说一句,不要拿web开发的模式往手机上套好不?这种操作模式适合手机吗?手机开发不单单是功能,外观,更重要的是个用户体验
|
|
返回顶楼 | |
发表时间:2011-08-23
woaidousha 写道 很想说一句,不要拿web开发的模式往手机上套好不?这种操作模式适合手机吗?手机开发不单单是功能,外观,更重要的是个用户体验
|
|
返回顶楼 | |
发表时间:2011-08-23
abeibenren 写道 woaidousha 写道 很想说一句,不要拿web开发的模式往手机上套好不?这种操作模式适合手机吗?手机开发不单单是功能,外观,更重要的是个用户体验
呵呵,表示同意。上段时间我们实现过类Web的下拉列表,做出来感觉特别扭 |
|
返回顶楼 | |
发表时间:2011-08-25
abeibenren 写道 woaidousha 写道 很想说一句,不要拿web开发的模式往手机上套好不?这种操作模式适合手机吗?手机开发不单单是功能,外观,更重要的是个用户体验
手机毕竟是手机 |
|
返回顶楼 | |
发表时间:2011-08-25
zhuixinjian 写道 核心代码 holder.icon.setPadding(25 * (level + 1),
holder.icon.getPaddingTop(), 0, holder.icon.getPaddingBottom()); 哈哈,感觉level才是核心代码 |
|
返回顶楼 | |