【问题标题】:Custom Grid View with Row span and Column span具有行跨度和列跨度的自定义网格视图
【发布时间】:2013-01-21 15:03:15
【问题描述】:

我正在尝试实现具有图形视图的网格视图,如下所示。我浏览了各种博客和 S.O 问题,不幸的是我无法为一个特定的网格项目提供行和列跨度,并且网格视图也不支持此功能。 而且我不想创建动态滚动视图与其他视图之间,因为有很多数据,它会导致性能问题。 所以如果有人有任何建议。请回复 。 提前致谢。

【问题讨论】:

    标签: java android gridview scroll html-table


    【解决方案1】:

    这里是您所有问题的解决方案:https://github.com/felipecsl/AsymmetricGridView 是的,我厌倦了Android没有这样的课程,我自己写了。 希望对你有用。

    【讨论】:

      【解决方案2】:

      您打算为您的可滚动视图重复该模式吗?更清楚地说,您的跨度较大的 Grid 项目是否定期重复?

      一种选择是使用列表视图并使用两个普通视图将大跨度视图实现为带有“special_row”标签的列表视图的一行,并将常规视图实现为带有“普通行”标签的另一行”。根据要求,您可以通过访问行标签来回收行。

      编辑:

      我找到了一个实现 pinterest 的库,比如 android 的 UI。这有一个对称的观点。结帐PinterestLisView

      编辑:

      Here 是另一种有趣的技术,它为网格项指定列跨度和行跨度。我取自this question。我想您可以通过以编程方式指定列和行跨度来取消网格项的静态 xml 声明。

      【讨论】:

      • 嗨@supreethks 感谢您的回复...您的第一个建议很好,但我的布局中完全不需要两个列表视图,因为我只会在左上角和网格的其余部分有一个大图像视图将是正常的。关于您的第二个建议,我使用的是网格视图而不是网格布局。虽然我找到了一个非常好的教程sudarnimalan.blogspot.sg/2012/06/… 重新分级,但它对我来说并没有多大用处,因为在我的场景中,我需要在单个网格项目上使用多个按钮和图像。
      【解决方案3】:

      这是 3 个柱状网格的特殊解决方案,其中特色项目跨越 2x2 网格。

      public class GridAdapter extends ArrayAdapter<GridAdapter.GridItem> {
          public GridAdapter(Context context, int itemViewResId, List<String> things) {
              super(context, itemViewResId, buildGridItems(things));
          }
      
          /**
           * Assumes 3 column layout. A list of indices that shows a large
           * item on the right of 1st row, then alternating on every 3rd row 
           * to the left and then right. The large item should occupy a 2x2 grid.
           *
           *   X O O
           *   X O O
           *   X X X
           *   X X X
           *   O O X
           *   O O X
           *   X X X
           *   X X X
           *   X O O
           *   X O O
           *   X X X
           *
           * The indices where the large featured items are in item list is 
           * 1, 9, 19, 27, 37, 45, 55, ...         
           */
          protected static List<Integer> getFeaturedIndex(int total) {
              int pos = 1;
              ArrayList<Integer> index = new ArrayList<Integer>();
              if (pos + 1 < total) {
                  index.add(pos);
              }
              for (int i = 0; pos < total; i++) {
                  int inc = i % 2 == 0 ? 8 : 10;
                  pos += inc;
                  if (pos + 1 < total) {
                      index.add(pos);
                  }
              }
              return index;
          }
      
          protected static List<GridItem> buildGridItems(List<String> things) {
              ArrayList<GridItem> items = new ArrayList<GridItem>();
              List<Integer> featuredIndex = getFeaturedIndex(things.size());
              ArrayList<GridItem> featured = new ArrayList<GridItem>();
              for (int i = 0, k = things.size(); i < k; i++) {
                  GridItem item = new GridItem(things.get(i));
                  if (featuredIndex.contains(i)) {
                      item.feature = true;
                      featured.add(item);
                  }
                  items.add(item);
              }
              for (GridItem feature : featured) {
                  int index = items.indexOf(feature);
                  GridItem shim = new GridItem(feature.getModel());
                  shim.shim = true;
                  items.add(index + 1, shim);
                  items.add(index + 3, shim);
                  items.add(index + 4, shim);
              }
              return items;
          }
      
          @Override
          public int getItemViewType(int position) {
              return getItem(position).shim ? 0 : 1;
          }
      
          @Override
          public int getViewTypeCount() {
              return 2;
          }
      
          public View getView(int position, View convertView, ViewGroup parent) {
              if (convertView == null) {
                  convertView = new View(getContext());
              }
              GridItem item = getItem(position);
              if (item.feature) {
                  convertView.setLayoutParams(new LayoutParams(400,300));
              } else {
                  convertView.setLayoutParams(new LayoutParams(200,150));
              }
              if (item.shim) {
                  convertView.setVisibility(View.GONE);
              }
              return convertView;
          }
      
          public static class GridItem {
              private String mItem;
              private boolean shim = false;
              private boolean feature = false;
      
              public GridItem(String item) {
                  mItem = item;
              }
          }
      }
      

      这个想法是用 GridItem 包装项目列表,并带有一个 featureshim 标志来确定视图的行为方式。

      getFeaturedIndex() 方法计算原始列表中的哪些项目应该被推荐。然后在buildGridItems() 我们采取2个步骤。首先,标记所有特色项目(并保留这些项目的列表)。然后,为每个特色项目添加 3 个相对于特色项目的垫片(+1、+3 和 +4)。

      getView() 的特色项目中,我们将适当的尺寸设置为普通项目的 2x2。对于 shim 项,将可见性设置为 GONE

      【讨论】:

        猜你喜欢
        • 2022-08-04
        • 1970-01-01
        • 1970-01-01
        • 2015-05-18
        • 2011-09-06
        • 2020-07-23
        • 1970-01-01
        • 1970-01-01
        • 2019-12-04
        相关资源
        最近更新 更多