当前位置:  编程技术>移动开发

自己实现的android树控件treeview

    来源: 互联网  发布时间:2014-10-22

    本文导语:  1.开发原因在项目中经常需要一个需要一个树状框架,这是非常常见的控件。不过可能是谷歌考虑到android是手机系统,界面宽度有限,所以只提供了只有二级的ExpandableListView。虽然这个控件可以满足很多需求,但是无数级的树...

1.开发原因
在项目中经常需要一个需要一个树状框架,这是非常常见的控件。不过可能是谷歌考虑到android是手机系统,界面宽度有限,所以只提供了只有二级的ExpandableListView。虽然这个控件可以满足很多需求,但是无数级的树在某些情况下还是需要的,所以我花了一天时间(大部分时间都在调试动画去了,不过现在动画还有点问题,具体原因不明。。如果某位大神能找到原因灰常感谢)。

2.原理

网上很多都是扩展listview实现的,不过listview貌似不支持复杂控件的事件?而且做动画也不方便,所有我决定扩展linearlayout,在里面增加子节点的方式实现。

3.代码

TreeView.java:

代码如下:

 package net.memornote.android.ui.view;

 import java.util.ArrayList;
 import java.util.List;
 import java.util.Timer;
 import java.util.TimerTask;

 import android.content.Context;
 import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.LinearLayout;

public class TreeView extends LinearLayout{

//    private List items;
    private List sortedItems;
    private int animTime;

    public TreeView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setOrientation(LinearLayout.VERTICAL);
    }
    /**
     * initialize data,you must make sure that each item has parent except the top ones.
     * @param items the data to show
     * @param index the index of the tree to insert to
     * @param viewHeight each view's height
     * @param animTime if you want expand animation,
     * you can set the time(ms) of animation,otherwise you can set 0.
     *
     */
    public void initData(List items,int index){

        if(items==null||items.size()==0){
            return ;
        }

        sortItemList(items);

        int size=sortedItems.size();

        initAddIndex=index0){
           List list=item.getChildrens();
           for (TreeItem it :    list) {
               View view=it.getView();
               if(!it.isShow){
                   continue;
               }
//                removeViewAt(viewIndex);

               TranslateAnimation ta=new TranslateAnimation(0, 0, 0, 0);
               ta.setFillAfter(true);
               ta.setDuration(1000);
               view.startAnimation(ta);
//                viewIndex++;
               removeCount++;
               it.isShow=false;
               view.setVisibility(View.GONE);
               if(isAnim){
                   animHeight+=it.getViewHeight();
               }
               if(isRecurse){
                   removeChild(it,true);
               }
           }
       }
   }

   private void animAdd(){
       TranslateAnimation ta=new TranslateAnimation(
               Animation.ABSOLUTE, 0,
               Animation.ABSOLUTE, 0,
               Animation.ABSOLUTE, animHeight,
               Animation.ABSOLUTE, 0);
       ta.setFillBefore(true);
//        ta.setFillAfter(false);
       ta.setDuration(animTime);

       for (int i = viewIndex+1; i < getChildCount(); i++) {
           View view=getChildAt(i);
           view.startAnimation(ta);
       }
       animHeight=0;
   }
   private void animRemove(){
       TranslateAnimation ta=new TranslateAnimation(
               Animation.ABSOLUTE, 0,
               Animation.ABSOLUTE, 0,
               Animation.ABSOLUTE, animHeight,
               Animation.ABSOLUTE, 0);
       ta.setFillAfter(false);
       ta.setFillBefore(true);
       ta.setDuration(animTime);

       int startAnimIndex;
       startAnimIndex=viewIndex+1;
       for (int i = startAnimIndex; i < getChildCount(); i++) {
           View view=getChildAt(i);

           view.startAnimation(ta);
       }
       animHeight=0;
   }
   public void expand(TreeItem item){
       viewIndex=indexOfChild(item.getView());
       addChild(item,false);
       if(isAnim){
           animAdd();
       }
   }
  

   public void expandAllChildren(TreeItem item) {
       viewIndex=indexOfChild(item.getView());
       addChild(item,true);
       if(isAnim){
           animAdd();
       }
   }

   public void expandAll(){
       if(sortedItems==null){
           return ;
       }
       for (TreeItem item : sortedItems) {
           expandAllChildren(item);
       }
   }

   public void contractAllChildren(TreeItem item) {
       viewIndex=indexOfChild(item.getView())+1;
       removeChild(item,true);
       if(isAnim){
           animRemove();
       }
   }

   public void contractAll(){
       if(sortedItems==null){
           return ;
       }
       for (TreeItem item : sortedItems) {
           contractAllChildren(item);
       }
   }

   public void bind(TreeItem item) {
       if(item.nextIsExpand){
           expand(item);
       }else {
           contractAllChildren(item);
       }
       item.nextIsExpand=!item.nextIsExpand;
   } 
}

TreeItem.java

代码如下:

package net.memornote.android.ui.view;

import java.util.ArrayList;
import java.util.List;

import android.view.View;

public class TreeItem {
    private View view;
   private TreeItem parent;
   private List childrens=new ArrayList(0);
   public boolean nextIsExpand=true;
   public boolean isShow=false;
   private int viewHeight; 

  
   public TreeItem(){}
   public TreeItem(int id,View view, TreeItem parent) {
       super();
       this.view = view;
       this.parent = parent;
   }

   public View getView() {
       if(view!=null){
           view.setPadding(getLevel()*20,0,0,0);
       }
       return view;
   }

   public void setView(View view) {
       this.view = view;
   }

   public TreeItem getParent() {
       return parent;
   }

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

   /**
    * 动态获取该节点的级数
    * @return
    */
   public int getLevel() {
       int level=0;
       TreeItem localParent=parent;

       while (localParent!=null) {
           level++;
           localParent=localParent.getParent();
       }

       return level;
   }
   public List getChildrens() {
       return childrens;
   }
   public int getViewHeight() {
       if(view==null||view.getHeight()==0){
           return viewHeight;
       }
       return view.getHeight();
   }
   public void setViewHeight(int viewHeight) {
       this.viewHeight = viewHeight;
   }
}

测试代码:

代码如下:

package net.memornote.android.ui;

import net.memornote.android.R;
import net.memornote.android.ui.fragment.MainFragment;
import net.memornote.android.ui.fragment.MenuFragment;

import com.actionbarsherlock.view.Menu;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity;

import android.os.Bundle;
import android.view.KeyEvent;

public class MainActivity extends SlidingFragmentActivity {
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       setContentView(R.layout.slid_content_frame);

               tv_notebook=(TreeView)   findViewById(R.id.tv_notebook);

       List items=new ArrayList();

       initData(items);
       tv_notebook.initData(items, 0);
       tv_notebook.enabledAnim(500);

   }
   //初始化一些测试数据
   public void initData(List items) {
       for (int i=0;i


    
 
 

您可能感兴趣的文章:

  • 在QLable控件上如何绘图???我想实现在label控件上绘图,大家帮忙~~~
  • C#实现根据指定容器和控件名字获得控件的方法
  • 请问VC生成的控件怎么在JAVA里面调用,就是显示在网页上,里面的方法可以实现?
  • 开发板运行交互式网页,控件包含linux命令,用什么方法实现?
  • 象CSDN这样的树形结构的控件是怎么实现的,有源代码吗
  • java 实现 vb中timer控件的功能?
  • applet 能否实现控件的功能
  • python调用短信猫控件实现发短信功能实例
  • java通过复选框控件数组实现添加多个复选框控件示例分享
  • 实现DataGridView控件中CheckBox列的使用实例
  • 提问:JBuilder4中,JTable控件如何实现定时刷新?
  • 请问怎样实现光标定位于某个控件上?
  • WinForm实现移除控件某个事件的方法
  • 解决C#中取消方向键对控件焦点控制的实现方法
  • c#实现DataGridView控件隔行变色(winform)的代码
  • WinForm自定义函数FindControl实现按名称查找控件
  • WinForm实现按名称递归查找控件的方法
  • C#自定义控件添加右键菜单的实现代码
  • WinForm子窗体访问父窗体控件的实现方法
  • 求救:如何制作象VB工具栏一样,实现按钮或其他控件的动态拖放添加到当前容器,而且还能拖动和改变大小!
  • 请问如何在程序中编写代码实现Treeview节点焦点的切换。
  • C#TreeView 无限级别分类实现方法
  • asp.net TreeView复选框全选或全不选的实现方法
  • c#用Treeview实现FolderBrowerDialog 和动态获取系统图标(运用了Win32 dll类库)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Android 按后退键退出Android程序的实现方法
  • android panellistview 圆角实现代码
  • Android实现弹出键盘的方法
  • Android实现信号强度监听的方法
  • Android设置桌面背景图片的实现方法
  • 请教如何在android平台下实现每个进程的流量监控?
  • Android平台的QT实现 Necessitas
  • Android实现关机重启的方法分享
  • android activity设置无标题实现全屏
  • android实现关闭或开启移动网络数据
  • android4.0屏蔽HOME键的简单实现
  • Android 实现永久保存数据的方法详解
  • Android手机获取root权限并实现关机重启功能的方法
  • android开发教程之实现toast工具类
  • Android判断屏幕是横屏或是竖屏的简单实现方法
  • Android中button实现onclicklistener事件的两种方式
  • Android实现动态显示或隐藏密码输入框的内容
  • Android实现Flip翻转动画效果
  • android实现背景平铺的三种方法
  • Android创建文件实现对文件监听示例
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • socket实现多文件并发传输,求助多线程实现问题?
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • interface 到底有什么用???实现接口,怎么实现??
  • 通过javascript库JQuery实现页面跳转功能代码
  • 怎么用Jsp实现在页面实现树型结构?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • windows 下的PortTunnel 在linux下怎么实现?或者相应的已经实现的软件?端口映射
  • php实现socket实现客户端和服务端数据通信源代码
  • 网站重定向用C语言实现iptables,ACL实现
  • flash AS3反射实现(describeType和getDefinitionByName)




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3