代码之家  ›  专栏  ›  技术社区  ›  Hamid

Android在循环中引用自定义视图?

  •  1
  • Hamid  · 技术社区  · 14 年前

    我需要递归地遍历我的一组扩展视图类的自定义视图。

    例如。

    ViewOne.java
    ViewTwo.java
    ViewThree.java
    

    我已经在mainclass.java中创建了每个视图的实例

    ViewOne vOne;
    ViewTwo vTwo;
    ViewThree vThree;
    

    这些视图都实现了一个名为 start() .

    我想通过某种方式循环它们:

    for(int i=0; i<= 2:i++)
    {
      views[i].start();
    }
    

    我该怎么做呢?

    以上只是一个例子。我需要能够以数字和编程的方式浏览它们的真正原因是,当单击按钮(上一个和下一个)时,我希望能够按其数字顺序向布局添加和删除视图。(我不希望在一开始就将它们全部添加到布局中,因为它们是大量资源密集型视图)。

    所以我们需要的是:

    单击下一步->添加下一个视图->删除当前视图。 单击上一步->添加上一个视图->删除当前视图。

    例如

    currView = 1
    
    Current View is currView (1)
    Click Next
    Add View currView+1 (2) to Layout
    Switch to View currView+1 (2)
    Remove View currView (1)
    
    or
    
    currView = 2
    
    Current View is currView (2)
    Click Previous
    Add View currView-1 (1) to Layout
    Switch to currView-1 (1)
    remove View currView (2)
    

    注意,这些视图都是它们自己的唯一类型,实际上是扩展视图的单个类我不能简单地将它们类型转换为“view”,因为这是错误的,它们的类型分别是viewOne、viewTwo和viewThree(例如)。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Erich Douglass    14 年前

    假设所有视图都已添加到布局中,则可以编程方式遍历视图组(即布局)中的所有子视图,如下所示:

    ViewGroup group = findViewById(R.id.root); // The name of your layout
    int children = group.getChildCount();
    for (int i = 0; i < children; i++) {
    
        View child = group.getChildAt(i);
        if (child instanceof ViewOne) {        
           ... 
        } else if (child instanceof ViewTwo) {
           ...
        }
    }
    

    另外,如果您的所有自定义视图都实现了 start() ,我会将该方法推送到一个接口中,以便您可以简化 if 上面的方块。

        2
  •  0
  •   anonanon    14 年前

    如果你想这样做,我会做一个视图列表,并通过这个列表循环例如:

    List views = new ArrayList();
    views.add(vOne);
    views.add(vTwo);
    views.add(vThree);
    
    for (View view: views) {
    view.start();
    }
    
        3
  •  0
  •   Ian Leslie    14 年前

    因为您试图推迟视图的构建,所以我建议您使用构建器模式。根据您的示例创建一个接口 Builder 并导出三个子类:

    public class BuildViewOne implements Builder { 
        ... 
        public View start () { return new ViewOne (); }
    }
    
    public class BuildViewTwo implements Builder { 
        ... 
        public View start () { return new ViewTwo (); }
    }
    
    public class BuildViewThree implements Builder { 
        ... 
        public View start () { return new ViewThree (); }
    }
    

    这个 建设者 接口有一个start方法,该方法创建适当的视图,该视图将仅在需要时加载这些资源然后创建视图生成器数组:

    Builder builders[] = new Builder[] { 
        new BuildViewOne (), 
        new BuildViewTwo (), 
        new BuildViewThree ()
    }
    

    现在可以通过类的索引创建一个类实例 builders[2].start () 是的。根据您的问题,您还可以使用生成器缓存创建的视图,以允许您还实现 stop () 会破坏视图的方法。因此,当您从布局中删除视图时,您可以释放资源(我假设您只需要给定视图的一个实例)。

    注意:上面不是真正的代码(即我没有编译或运行它)。