Android - Gridlayout和Staggered Gridlayout之间的区别

时间:2015-12-11 05:45:30

标签: android android-layout android-gridlayout staggeredgridlayout

我在android material design api& amp;想以网格格式显示一些数据。我尝试了GridLayoutStaggeredGridlayout,两者看起来都一样。对于一般信息,我想问 GridlayoutStaggeredGridlayout之间有什么区别?

谢谢。

5 个答案:

答案 0 :(得分:57)

网格视图:它是一个ViewGroup,用于显示二维可滚动网格中的项目。在此,每个 网格具有相同的大小(高度和宽度)。 网格视图在视图中显示对称项目。

Grid View

交错网格视图:它基本上是Grid View的扩展,但在此每个 网格具有不同的大小(高度和宽度) < / strong>即可。交错网格视图显示视图中的非对称项目。

staggered grid view

实施交错网格视图的教程:

  1. Staggered Grid View
  2. Pinterest Masonry layout Staggered Grid View

答案 1 :(得分:5)

我在Oodles Technologies的时间告诉我交错。 我会分享这个。

StaggeredGridLayout 是一个LayoutManager,它就像一个网格视图,但在这个网格中,每个视图都有自己的大小(高度和宽度)。它支持垂直和水平布局。

以下是创建交错网格的一些基本步骤 -

1)创建视图。

正如我们所知,staggeredgrid不是一个直接视图,它是一个布局管理器,它以交错的网格形式布置儿童。我们使用RecyclerView作为交错网格的视图。 这是我们的布局回收视图 -

<relativelayout android:layout_height="match_parent" android:layout_width="match_parent" android:paddingtop="@dimen/activity_vertical_margin" tools:context="com.deepanshu.staggered_gridlayout.MainActivity" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">

    <android.support.v7.widget.recyclerview android:id="@+id/favPlaces" android:layout_height="match_parent" android:layout_width="match_parent">
</android.support.v7.widget.recyclerview></relativelayout>

2)设置StaggeredGridLayout LayoutManager。

我们的视图准备就绪后,让我们使用Layoutmanager在视图上创建网格。

RecyclerView favPlaces = (RecyclerView) findViewById(R.id.favPlaces);
       StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
       layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);
       favPlaces.setLayoutManager(layoutManager);
       favPlaces.setHasFixedSize(true);

3)适配器以扩展交错网格视图。

首先以网格的形式对数据进行膨胀,我们需要一个代表该数据的布局。我们正在使用CardView,布局是 -

<android.support.v7.widget.cardview android:layout_height="wrap_content" android:layout_width="match_parent" app:cardcornerradius="4dp" app:cardusecompatpadding="true">
    <linearlayout android:background="@color/colorPrimary" android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical">



    <imageview android:adjustviewbounds="true" android:id="@+id/placePic" android:layout_height="match_parent" android:layout_width="match_parent" android:scaletype="fitXY">

           <textview android:gravity="center" android:id="@+id/placeName" android:layout_height="wrap_content" android:layout_width="match_parent" android:textsize="16sp">


    </textview></imageview></linearlayout>
</android.support.v7.widget.cardview>

</linearlayout>

然后我们设置了所有基本步骤,是时候完成我们的主要活动了。这是主要活动的完整代码 -

public class MainActivity extends AppCompatActivity {

    int placeImage[]= {R.drawable.agattia_airport_lakshadweep,R.drawable.nainital,R.drawable.goa,
            R.drawable.lotus_temple,R.drawable.valley_of_flowers,R.drawable.ranikhet,R.drawable.dehradun,R.drawable.nainital1};

    String placeName[]= {"Lakshadweep, India","Nainital, India","Goa, India","Lotus-Temple, India","Valley-Of-Flowers, India","Ranikhet, India",
    "Dehradun, India","Nainital, India"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RecyclerView favPlaces = (RecyclerView) findViewById(R.id.favPlaces);
        StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
        layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);
        favPlaces.setLayoutManager(layoutManager);
        favPlaces.setHasFixedSize(true);
        ArrayList<PlaceDetails> placeList = getPlaces();

        StaggeredAdapter staggeredAdapter = new StaggeredAdapter(placeList);
        favPlaces.setAdapter(staggeredAdapter);
    }

    private ArrayList<PlaceDetails> getPlaces() {
        ArrayList<PlaceDetails> details = new ArrayList<>();
        for (int index=0; index<placeImage.length;index++){
            details.add(new PlaceDetails(placeImage[index],placeName[index]));
        }
        return details;
    }
}

答案 2 :(得分:2)

网格布局(API级别14): 将子级放置在矩形网格中的布局。 可以使用android:rowCountandroid:columnCount属性声明网格中的行数和列数。但是,通常情况下,如果声明列数,则GridLayout将根据占用单元格的数量推断行数,从而不再需要使用rowCount属性。 类似地,GridLayout的方向可以选择通过android:orientation属性定义。

我认为没有单独的StaggeredGridLayout。这是我们拥有的东西

StaggeredGridLayoutManager: 它是Recyclerview.A LayoutManager中使用的布局管理器之一,它以交错的网格形式布置子项。它支持水平和水平垂直布局以及反向布局儿童的能力。

交错的GridView: StaggeredGridView允许用户使用与Pinterest外观类似的不均匀行创建GridView。包括自己的OnItemClickListener和OnItemLongClickListener,选择器和固定位置恢复。请查看 this 示例。

答案 3 :(得分:1)

<强> StaggeredGridlayout

  1. 这使得儿童处于错开的网格状态。
  2. 它支持水平&amp;垂直布局以及反向布局儿童的能力。
  3. 交错网格可能在布局边缘有间隙。
  4. 为避免间隙,StaggeredGridLayoutManager可以独立偏移跨距或在跨距之间移动项目。您可以通过setGapStrategy(int)
  5. 来控制此行为

    <强> GridLayout的

    1. 这将它的孩子放在一个矩形网格中。
    2. 网格由一组无限细线组成,将观察区域分隔为单元格。
    3. 根据rowSpeccolumnSpec布局参数的定义,儿童占据一个或多个连续的单元格。
    4. Example of GridLayout

答案 4 :(得分:0)

交错网格布局包括多列不同大小的多行。

它允许具有页眉和页脚的灵活列/行视图,并且看起来相当容易实现,但Gradle用户将比使用Eclipse和Ant的用户更容易。这就是视图在开发它的Etsy Github app中的样子。

GridLayout是将其子项放在矩形网格中的布局。

它是在API级别14中引入的,最近被移植到支持库中。其主要目的是解决其他布局中的对齐和性能问题。如果您想了解有关GridLayout的更多信息,请查看this tutorial