2013-01-21 19 views
5

グリッドビューを実装しようとしていますが、次のようなグラフィカルビューがあります。私は様々なブログやS.Oの質問を行ってきました。残念ながら、特定のグリッドアイテムに行と列のスパンを提供できず、グリッドビューもこの機能をサポートしていません。 そして、私は、多くのデータがあり、パフォーマンスの問題を引き起こすため、間に他のビューを持つダイナミックスクロールビューを作成したくありません。 だからいずれかの提案があれば。返信してください 。 ありがとうございます。 enter image description here行スパンと列スパンを含むカスタムグリッドビュー

答えて

2

スクロール可能なビューのパターンを繰り返しますか?より明確にするには、定期的に大きなスパンのグリッドアイテムを繰り返しますか?

リストビューを使用し、2つの通常ビューをリストビューの1つの行として「special_row」などのタグを使用して実装し、通常ビューを「normal行"。この要件に基づいて、行タグにアクセスして行をリサイクルすることができます。

EDIT:

私はアンドロイドのためのUIのようなPinterestのを実装したライブラリを見つけました。これには対称的なビューがあります。チェックアウトPinterestLisView

EDIT:

Hereグリッド項目のcoulmnスパンと行スパンを指定することにより、別の興味深い手法です。私はthis questionから取った。列と行のスパンをプログラムで指定することで、グリッド項目の静的なxml宣言を取り除くことができると思います。

+1

こんにちは@返信ありがとうございました... 最初の提案はよかったですが、私はレイアウトの中で2つのリストビューを必要としません。1つのイメージが左上に大きく、グリッドビューの残りの部分は正常になります。 2番目の提案についてグリッドレイアウトではなくグリッドビューを使用しています。 私は非常に良いチュートリアルを見つけましたが、http://sudarnimalan.blogspot.sg/2012/06/android-bigger-image-for-first-item-of.html それを後退させましたが、それほど役に立ちませんでした。私のシナリオでは、単一のグリッドアイテム上に複数のボタンと画像が必要です。 –

3

すべての問題の解決方法は次のとおりです。https://github.com/felipecsl/AsymmetricGridView ええ、私はこのようなクラスを持たないAndroidに疲れて、自分で書きました。 あなたにとって便利なことを願っています。

0

これは、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; 
     } 
    } 
} 

アイデアは、ビューがどのように振る舞うべきかを決定featureshimフラグをGridItemでアイテムリストをラップすることです。

メソッドgetFeaturedIndex()は、元のリスト内のどのアイテムを表示するかを計算します。その後、buildGridItems()では2ステップを踏みます。まず、フィーチャーされたすべてのアイテムにフラグを立てます(これらのアイテムのリストを保持します)。その後、これらのおすすめアイテムのそれぞれについて、おすすめアイテムに関連して3つのシム(+1、+3、+ 4)を追加します。

注目アイテムのgetView()では、適切なサイズを通常アイテムの2x2に設定しました。シムアイテムの場合は、可視性をGONEに設定します。

関連する問題