Android 多级菜单的实现

来源:互联网 发布:九宫飞星排盘软件下载 编辑:程序博客网 时间:2024/05/10 16:15

大致效果如下:




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:textAppearance="?android:textAppearanceMedium"
  9. android:gravity="center_vertical" android:id="@+id/text"
  10. android:textColor="#ffffff" android:layout_width="fill_parent"
  11. android:layout_height="fill_parent" android:singleLine="true"
  12. android:layout_toRightOf="@id/icon" android:layout_alignParentTop="true"
  13. android:layout_alignParentBottom="true" />
  14. </RelativeLayout>



TreeElement.java:

Java代码 收藏代码
  1. package com.iaiai;
  2. import java.util.ArrayList;
  3. public classTreeElement {
  4. private String id;
  5. private String outlineTitle;
  6. private booleanmhasParent;
  7. private booleanmhasChild;
  8. private TreeElement parent;
  9. private intlevel;
  10. private ArrayList<TreeElement> childList =newArrayList<TreeElement>();
  11. public String getId() {
  12. return id;
  13. }
  14. public voidsetId(String id) {
  15. this .id = id;
  16. }
  17. public String getOutlineTitle() {
  18. return outlineTitle;
  19. }
  20. public voidsetOutlineTitle(String outlineTitle) {
  21. this .outlineTitle = outlineTitle;
  22. }
  23. public booleanisMhasParent() {
  24. return mhasParent;
  25. }
  26. public voidsetMhasParent(booleanmhasParent) {
  27. this .mhasParent = mhasParent;
  28. }
  29. public booleanisMhasChild() {
  30. return mhasChild;
  31. }
  32. public voidsetMhasChild(booleanmhasChild) {
  33. this .mhasChild = mhasChild;
  34. }
  35. public intgetLevel() {
  36. return level;
  37. }
  38. public voidsetLevel(intlevel) {
  39. this .level = level;
  40. }
  41. public booleanisExpanded() {
  42. return expanded;
  43. }
  44. public voidsetExpanded(booleanexpanded) {
  45. this .expanded = expanded;
  46. }
  47. public ArrayList<TreeElement> getChildList() {
  48. return childList;
  49. }
  50. public TreeElement getParent() {
  51. return parent;
  52. }
  53. public voidsetParent(TreeElement parent) {
  54. this .parent = parent;
  55. }
  56. // private OutlineElement outlineElement;
  57. private booleanexpanded;
  58. public voidaddChild(TreeElement c) {
  59. this .childList.add(c);
  60. this .mhasParent = false;
  61. this .mhasChild = true;
  62. c.parent = this ;
  63. c.level = this .level + 1;
  64. }
  65. public TreeElement(String id, String title) {
  66. super ();
  67. this .id = id;
  68. this .outlineTitle = title;
  69. this .level = 0;
  70. this .mhasParent = true;
  71. this .mhasChild = false;
  72. this .parent = null;
  73. }
  74. public TreeElement(String id, String outlineTitle,booleanmhasParent,
  75. boolean mhasChild, TreeElement parent,intlevel,booleanexpanded) {
  76. super ();
  77. this .id = id;
  78. this .outlineTitle = outlineTitle;
  79. this .mhasParent = mhasParent;
  80. this .mhasChild = mhasChild;
  81. this .parent = parent;
  82. if (parent != null) {
  83. this .parent.getChildList().add(this);
  84. }
  85. this .level = level;
  86. this .expanded = expanded;
  87. }
  88. }



TreeView.java:

Java代码 收藏代码
  1. package com.iaiai;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.app.ListActivity;
  5. import android.content.Context;
  6. import android.graphics.Bitmap;
  7. import android.graphics.BitmapFactory;
  8. import android.os.Bundle;
  9. import android.util.Log;
  10. import android.view.LayoutInflater;
  11. import android.view.View;
  12. import android.view.ViewGroup;
  13. import android.widget.ArrayAdapter;
  14. import android.widget.ImageView;
  15. import android.widget.ListView;
  16. import android.widget.TextView;
  17. import android.widget.Toast;
  18. public classTreeViewextendsListActivity {
  19. private ArrayList<TreeElement> mPdfOutlinesCount =newArrayList<TreeElement>();
  20. private TreeViewAdapter treeViewAdapter =null;
  21. /** Called when the activity is first created. */
  22. @Override
  23. public voidonCreate(Bundle savedInstanceState) {
  24. super .onCreate(savedInstanceState);
  25. initialData();
  26. treeViewAdapter = new TreeViewAdapter(this, R.layout.main,
  27. mPdfOutlinesCount);
  28. setListAdapter(treeViewAdapter);
  29. registerForContextMenu(getListView());
  30. }
  31. private voidinitialData() {
  32. TreeElement element1 = new TreeElement("01","关键类");
  33. TreeElement element2 = new TreeElement("02","应用程序组件");
  34. TreeElement element3 = new TreeElement("03","Activity和任务");
  35. TreeElement element4 = new TreeElement("04","激活组件:intent");
  36. TreeElement element5 = new TreeElement("05","关闭组件");
  37. TreeElement element6 = new TreeElement("06","manifest文件");
  38. TreeElement element7 = new TreeElement("07","Intent过滤器");
  39. TreeElement element8 = new TreeElement("08","Affinity(吸引力)和新任务");
  40. TreeElement element9 = new TreeElement("09","加载模式");
  41. TreeElement element10 = new TreeElement("10","加载模式孩子1");
  42. TreeElement element11 = new TreeElement("11","加载模式孩子2");
  43. TreeElement element12 = new TreeElement("12","加载模式孩子2的孩子1");
  44. TreeElement element13 = new TreeElement("13","加载模式孩子2的孩子2");
  45. TreeElement element14 = new TreeElement("14","加载模式孩子1的孩子1");
  46. TreeElement element15 = new TreeElement("15","加载模式孩子1的孩子2");
  47. TreeElement element16 = new TreeElement("16","加载模式孩子1的孩子3");
  48. TreeElement element17 = new TreeElement("17","加载模式孩子1的孩子4");
  49. TreeElement element18 = new TreeElement("18","加载模式孩子1的孩子5");
  50. TreeElement element19 = new TreeElement("19","加载模式孩子1的孩子6");
  51. mPdfOutlinesCount.add(element1);
  52. mPdfOutlinesCount.add(element2);
  53. mPdfOutlinesCount.add(element9);

  54. element2.addChild(element3);

  55. element1.addChild(element4);
  56. element1.addChild(element5);
  57. element1.addChild(element6);
  58. element1.addChild(element7);

  59. element7.addChild(element8);

  60. element9.addChild(element10);
  61. element9.addChild(element11);

  62. element11.addChild(element12);
  63. element11.addChild(element13);

  64. element10.addChild(element14);
  65. element10.addChild(element15);
  66. element10.addChild(element16);
  67. element10.addChild(element17);
  68. element10.addChild(element18);
  69. element10.addChild(element19);
  70. }
  71. @SuppressWarnings ( "unchecked" )
  72. private classTreeViewAdapterextendsArrayAdapter {
  73. public TreeViewAdapter(Context context,inttextViewResourceId,
  74. List objects) {
  75. super (context, textViewResourceId, objects);
  76. mInflater = LayoutInflater.from(context);
  77. mfilelist = objects;
  78. }
  79. private LayoutInflater mInflater;
  80. private List<TreeElement> mfilelist;
  81. public intgetCount() {
  82. return mfilelist.size();
  83. }
  84. public Object getItem( int position) {
  85. return position;
  86. }
  87. public longgetItemId(intposition) {
  88. return position;
  89. }
  90. public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
    convertView = mInflater.inflate(R.layout.activity_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.getOutlineTitle());
    }
    });


    holder.text.setText(obj.getOutlineTitle());


    if (obj.isMhasChild() && (obj.isExpanded() == false)) {
    holder.icon
    .setBackgroundResource(R.drawable.btn_check_on_selected);
    } else if (obj.isMhasChild() && (obj.isExpanded() == true)) {
    holder.icon
    .setBackgroundResource(R.drawable.btn_check_on_pressed);
    } else if (!obj.isMhasChild()) {
    holder.icon.setBackgroundResource(R.drawable.ic_action_search);
    }


    int level = obj.getLevel();
    convertView.setPadding(25 * (level + 1),
    holder.icon.getPaddingTop(), 0,
    holder.icon.getPaddingBottom());


    return convertView;
    }
  91. class ViewHolder {
  92. TextView text;
  93. ImageView icon;
  94. }
  95. }
  96. @Override
  97. protected voidonListItemClick(ListView l, View v,intposition,longid) {
  98. super .onListItemClick(l, v, position, id);
  99. Log.i("TreeView" , "position:"+ position);
  100. if (!mPdfOutlinesCount.get(position).isMhasChild()) {
  101. Toast.makeText(this , mPdfOutlinesCount.get(position)
  102. .getOutlineTitle(), 2000 );
  103. return ;
  104. }
  105. if (mPdfOutlinesCount.get(position).isExpanded()) {
  106. mPdfOutlinesCount.get(position).setExpanded(false);
  107. TreeElement element = mPdfOutlinesCount.get(position);
  108. ArrayList<TreeElement> temp = new ArrayList<TreeElement>();
  109. for ( inti = position +1; i < mPdfOutlinesCount.size(); i++) {
  110. if (element.getLevel() >= mPdfOutlinesCount.get(i).getLevel()) {
  111. break ;
  112. }
  113. temp.add(mPdfOutlinesCount.get(i));
  114. }
  115. mPdfOutlinesCount.removeAll(temp);
  116. treeViewAdapter.notifyDataSetChanged();
  117. } else {
  118. TreeElement obj = mPdfOutlinesCount.get(position);
  119. obj.setExpanded(true );
  120. int level = obj.getLevel();
  121. int nextLevel = level + 1;
  122. for (TreeElement element : obj.getChildList()) {
  123. element.setLevel(nextLevel);
  124. element.setExpanded(false );
  125. mPdfOutlinesCount.add(position + 1 , element);
  126. }
  127. treeViewAdapter.notifyDataSetChanged();
  128. }
  129. }
  130. }

 

原创粉丝点击