次のようにグラフィカル ビューを持つグリッド ビューを実装しようとしています。私はさまざまなブログや SO の質問を調べましたが、残念ながら 1 つの特定のグリッド アイテムに行と列のスパンを提供することができず、グリッド ビューもこの機能をサポートしていません。また、大量のデータがあり、パフォーマンスの問題が発生するため、その間に他のビューを含む Dynamic Scroll View を作成したくありません。だから、何か提案があれば。返信してください 。前もって感謝します。
3 に答える
すべての問題の解決策は次のとおりです。https://github.com/felipecsl/AsymmetricGridView ええ、Android にこのようなクラスがないことにうんざりして、自分で書きました。お役に立てば幸いです。
スクロール可能なビューのパターンを繰り返すつもりですか? より明確にするために、大きなスパンを持つグリッドアイテムは定期的に繰り返されますか?
1 つのオプションは、リスト ビューを使用し、「special_row」などのタグを使用してリスト ビューの 1 つの行として 2 つの通常のビューを含む大規模なスパン ビューを実装し、「通常の行」などのタグを使用して通常のビューを別の行として実装することです。要件に基づいて、行タグにアクセスして行をリサイクルできます。
編集:
Android用のUIのようなピンタレストを実装するライブラリを見つけました。これには対称的なビューがあります。PinterestLisViewをチェックしてください。
編集:
グリッド アイテムの列スパンと行スパンを指定する別の興味深い手法を次に示します。私はこの質問から取った。列と行のスパンをプログラムで指定することにより、グリッド項目の静的 xml 宣言を廃止できると思います。
これは、2x2 グリッドにまたがる主要アイテムを含む 3 列グリッドの特定のソリューションです。
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;
}
}
}
アイデアは、ビューの動作を決定するフラグfeature
とGridItem で項目リストをラップすることです。shim
このメソッドgetFeaturedIndex()
は、元のリストのどの項目を取り上げるべきかを計算します。次に、buildGridItems()
2 つの手順を実行します。まず、取り上げられているすべてのアイテムにフラグを立てます (そして、これらのアイテムのリストを保持します)。その後、これらの注目アイテムごとに、注目アイテムに関連する 3 つのシム (+1、+3、および +4) を追加します。
getView()
おすすめアイテムの では、通常のアイテムの 2x2 として適切なサイズを設定しています。shim アイテムの場合、可視性を に設定しGONE
ます。