【问题标题】:Android dynamically list items in rows depending on their sizeAndroid根据它们的大小动态地在行中列出项目
【发布时间】:2014-02-09 23:07:42
【问题描述】:

问题是,我想以编程方式将标签(如帖子底部的标签)添加到我的屏幕视图中。数量将是未知的,但可以说在 10 的范围内。我知道我可以使用水平列表视图,但我不确定如何以及是否可以将不合适的标签包装到下一行。我不认为这是可能的。接下来,使用 Gridview 是一个选项,但是如果它们的长度不同,如何为每个标签分配水平空间呢?有没有什么办法可以在不知道数量的情况下将它们连续列出并让它们动态换行到“下一行”?

【问题讨论】:

    标签: android android-layout android-listview android-gridview android-tablelayout


    【解决方案1】:

    最近我不得不接受与您所要求的类似的事情。我最终决定使用TableView,并动态构造TableRows。这看起来不错,直到我遇到如何知道何时将新项目添加到现有 TableRow 或将行添加到 TableView 并开始新项目的问题。

    我特别不喜欢但有效的解决方法(有些人甚至称其为 hack)如下:使用如下代码测量屏幕的宽度:

    final Display display = getWindowManager().getDefaultDisplay();
    final Point size = new Point();
    display.getSize(size);
    
    final WindowManager.LayoutParams params = getWindow().getAttributes();
    

    您将能够在 params.width 参数中获取屏幕宽度。我将它乘以0.95 以不严格适合行,主要是因为它可能无法正常工作。

    所以现在,您需要有一个循环来处理您要添加的所有项目,假设它们是TextViews。保留你已经添加的宽度的计数,如果新项目的宽度超过宽度,则将其添加到下一行。

    totalwidth = 0;
    for (TextView tv : myTVitems) {
      if (totalwidth + tv.getWidth() < parameters.width * 0.95) {
        // Add it to the existing row
        totalwidth += tv.getWidth();
      }
      else {
        // Add the `TableRow` to the `TableView` and start a new `TableRow`
        totalwidth = 0;
      }
    }
    

    我是从内存中写出来的,所以如果没有任何显式转换,它可能无法编译,但就是这样。

    【讨论】:

    • 我假设,例如从表格行中删除项目,我只是重申内容以重绘更新版本?
    • 使用这种方法,您无需删除任何内容,每一步您都在决定是将其添加到当前行还是通过将其添加到表中并开始填充新行来完成。但是,您也可以在需要时删除。
    猜你喜欢
    • 2021-09-15
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2011-11-09
    • 1970-01-01
    相关资源
    最近更新 更多