Java 具有行跨度和列跨度的自定义轴网视图

Java 具有行跨度和列跨度的自定义轴网视图,java,android,gridview,scroll,html-table,Java,Android,Gridview,Scroll,Html Table,我正在尝试实现一个网格视图,其图形视图如下所示。我浏览了各种博客和S.O问题,不幸的是,我无法提供一个特定网格项的行和列跨度,网格视图也不支持此功能。 我不想在创建动态滚动视图的同时在视图之间添加其他视图,因为存在大量数据,这会导致性能问题。 如果有人有什么建议的话。请回复。 提前谢谢。 是否要为可滚动视图重复该模式?更清楚地说,大跨度网格项目是否定期重复 一个选项是使用列表视图,将两个常规视图作为列表视图的一行(带有标记,如“special_row”),实现大跨度视图,并将常规视图作为另一行(

我正在尝试实现一个网格视图,其图形视图如下所示。我浏览了各种博客和S.O问题,不幸的是,我无法提供一个特定网格项的行和列跨度,网格视图也不支持此功能。 我不想在创建动态滚动视图的同时在视图之间添加其他视图,因为存在大量数据,这会导致性能问题。 如果有人有什么建议的话。请回复。 提前谢谢。

是否要为可滚动视图重复该模式?更清楚地说,大跨度网格项目是否定期重复

一个选项是使用列表视图,将两个常规视图作为列表视图的一行(带有标记,如“special_row”),实现大跨度视图,并将常规视图作为另一行(带有标记,如“normal row”)。根据需求,您可以通过访问行标记来回收行

编辑:

我发现了一个库,它为android实现了类似pinterest的UI。这里面有一个对称的视图。结帐

编辑:


另一个有趣的技术是为网格项指定coulmn跨度和行跨度。我从他那里拿走了。我想您可以通过编程方式指定列和行跨距来消除网格项的静态xml声明

以下是您所有问题的解决方案: 是的,我厌倦了Android没有这样的课程,我自己写的。
希望它对您有用。

这是一个针对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;
        }
    }
}
公共类GridAdapter扩展了ArrayAdapter{
公共GridAdapter(上下文上下文、int itemViewResId、列表内容){
super(context、itemViewResId、buildGridItems(things));
}
/**
*假设为3列布局。显示大型
*项目位于第一行右侧,然后每第三行交替
*从左到右。大项目应占据2x2网格。
*
*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
*
*大型特色项目在项目列表中的索引为
* 1, 9, 19, 27, 37, 45, 55, ...         
*/
受保护的静态列表getFeaturedIndex(整数总计){
int pos=1;
ArrayList索引=新的ArrayList();
如果(位置+1<总计){
添加索引(pos);
}
对于(int i=0;pos
我们的想法是使用GridItem包装项目列表,GridItem带有决定视图行为的
特性
垫片
标志

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


在特色项目的
getView()
中,我们将适当的维度设置为普通项目的2x2。对于垫片项目,将可见性设置为
GONE

Hi@supremethks谢谢您的回复。。。您的第一个建议很好,但我并不需要在我的布局中有两个列表视图,因为我将只在左上角有一个较大的图像,其余的网格视图将是正常的。关于你的第二个建议,我使用的是网格视图,而不是网格布局。虽然我发现了一个很好的教程,但它对我来说并没有多大用处,因为在我的场景中,我需要在一个网格项目上有多个按钮和图像。