自定义使用网格视图和行跨度和列跨度(Custom Grid View with Row span a

2019-07-18 12:10发布

我想实现它具有图形视图如下网格视图。 我已经通过各种博客和SO问题消失了,可惜我不能提供一个行和列跨度一个特定的网格项目和网格视图同样不支持此功能。 而且我也不想在这两者之间创建动态滚动查看其他意见的有大量的数据,它会导致性能问题。 因此,如果任何一个有任何建议。 请回复 。 提前致谢。

Answer 1:

你是否打算重复模式为您滚动的看法? 为了更清楚,你的网格项与定期大跨度的重复?

一种选择是使用列表视图,并用诸如“special_row”两个正常的意见与标签列表视图中的一行实现你的大跨度视图和执行规则的意见,包含“标准行”标记另一行。 根据要求,你可以通过访问该行的标签回收行。

编辑:

我发现,实现类似Pinterest的用户界面的Android库中。 这中有一个对称的观点。 结帐PinterestLisView 。

编辑:

这是通过指定coulmn跨度和行另一个有趣的技术跨越网格项目。 我从了这个问题 。 我想你可以通过编程指定列和行跨度废除的网格项目静态XML声明。



Answer 2:

下面是解决所有的问题: https://github.com/felipecsl/AsymmetricGridView呀,我厌倦了Android系统没有这样的类和自己写的。 希望这是对你有用。



Answer 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()我们采取两个步骤。 那些功能(并保持这些项目的列表)首先,标志中的所有项目。 此后,对于每一个特色项目,加3个垫片(+1,+3和+4)相对于功能的项目。

getView()为特色的项目,我们设置了合适的尺寸作为正常项目2×2。 对于垫片项目,能见度设置为GONE



文章来源: Custom Grid View with Row span and Column span