我正在尝试实现一个具有如下图形视图的网格视图。我浏览了各种博客和 SO 问题,不幸的是我无法为一个特定的网格项提供行和列跨度,并且网格视图也不支持此功能。而且我不想创建动态滚动视图与其他视图之间,因为有很多数据,它会导致性能问题。所以如果有人有任何建议。请回复 。提前致谢。
3 回答
这是您所有问题的解决方案:https ://github.com/felipecsl/AsymmetricGridView 是的,我厌倦了 Android 没有这样的类并自己编写了它。希望它对你有用。
您是否打算为可滚动视图重复该模式?更清楚地说,您的跨度较大的 Grid 项目是否定期重复?
一种选择是使用列表视图,并将具有两个普通视图的大跨度视图实现为列表视图的一行,带有“special_row”等标签,并将常规视图实现为另一行,带有“普通行”标签。根据要求,您可以通过访问行标签来回收行。
编辑:
我找到了一个实现 pinterest 的库,比如 android 的 UI。这有一个对称的观点。结帐PinterestLisView。
编辑:
这是另一种有趣的技术,通过为网格项指定列跨度和行跨度。我从这个问题中得到。我想您可以通过以编程方式指定列和行跨度来取消网格项的静态 xml 声明。
这是 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 包装项目列表,并使用 afeature
和shim
标志来确定视图的行为方式。
该方法getFeaturedIndex()
计算原始列表中的哪些项目应具有特色。然后在buildGridItems()
我们采取2个步骤。首先,标记所有特色项目(并保留这些项目的列表)。之后,对于这些特色项目中的每一个,相对于特色项目添加 3 个垫片(+1、+3 和 +4)。
在getView()
特征项目中,我们将适当的尺寸设置为正常项目的 2x2。对于垫片项目,将可见性设置为GONE
。