Android Tree 展示多級分類

jopen 13年前發布 | 49K 次閱讀 Android Android開發 移動開發

效果:
Android Tree 展示多級分類

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);    
        }   
    }   

}  

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!