在Android中,如何使verticalSpacing始终等于GridView中的horizo​​ntalSpacing?

时间:2015-06-15 04:03:13

标签: android android-layout gridview

我已经在xml布局中声明了GirdView,如下所示。

<GridView
    android:id="@+id/movies_gridview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:drawSelectorOnTop="true"
    android:columnWidth="92dp"
    android:numColumns="auto_fit"
    android:stretchMode="spacingWidthUniform"
    android:gravity="center_horizontal" />

我打算在此GridView.中显示固定大小的图片(垂直矩形而不是方形)我已将columnWidth设置为auto_fit,以便{{1}可以最佳地使用水平空间1}}根据可用的屏幕大小。 我已将GridView.设置为stretchMode,以便将列放置在距离所有边相等的位置。

我想将spacingWidthUniform设为等于verticalSpacing。我不能在xml中执行此操作,因为在运行时horizontalSpacing将取决于屏幕上的可用空间。此外,当更改设备方向时,horizontalSpacing将更改。

我的问题是:

  1. 如何确保horizontalSpacing始终等于verticalSpacing

  2. 如何让horizontalSpacing从头开始布局其第一列加上最后一列的填充和结束布局到GridView的末尾减去填充?

  3. 编辑1

    我尝试使用@simas解决方案来使用提到的自定义网格视图。 为此,

    1. 我将此类复制到我的源目录。

    2. 在布局xml中包含此网格视图,如下所示。

    3. GridView
      1. 将适配器设置为此gridview,如下所示

        <com.aviras.ashish.popularmoviesapp.widgets.CustomGridView
            android:id="@+id/movies_gridview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:columnWidth="@dimen/grid_item_width"
            android:drawSelectorOnTop="true"
            android:gravity="center_horizontal"
            android:numColumns="auto_fit"
            android:stretchMode="spacingWidthUniform"
            tools:listitem="@layout/grid_item_movie_poster" />
        
      2. 它仍然显示列和行的不同间距,如下所示。 enter image description here

        编辑2

        @simas在第二个问题中通过&#39;开始布局&#39;我的意思是 CustomGridView moviesGridView = (CustomGridView) rootView.findViewById(R.id.movies_gridview); moviesGridView.setAdapter(new MoviesAdapter(rootView.getContext().getApplicationContext(), mMovies)); 应该开始在GridView的开头绘制第一列,GridView的最后一列应该在GridView的末尾结束。此外,列和行应具有相等的间距。 如果这更能澄清我的问题,请告诉我。

3 个答案:

答案 0 :(得分:1)

您可以创建自定义GridView类并修改setHorizontalSpacingsetVerticalSpacing的功能,如下所示:

public class CustomGridView extends GridView {

    public CustomGridView(Context context) {
        super(context);
    }

    public CustomGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomGridView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public CustomGridView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public void setHorizontalSpacing(int horizontalSpacing) {
        super.setHorizontalSpacing(horizontalSpacing);
        // Call parent class to set the vertical spacing to be equal to the horizontal spacing
        super.setVerticalSpacing(horizontalSpacing);
    }

    @Override
    public void setVerticalSpacing(int verticalSpacing) {
        // Prevent the derived class from modifying the vertical spacing
        /*super.setVerticalSpacing(verticalSpacing);*/
    }

}

然后在xml中使用自定义类,如下所示:

关于你的第二个问题:我无法理解“开始布局”的含义。

您想要的结果的图像示例将有很大帮助。

答案 1 :(得分:0)

你可以使用custome gridview woth textview并按照你想要的方式放置空间,也可以轻松地将其设置为水平或垂直。

答案 2 :(得分:0)

<GridView
            android:id="@+id/gridView"
            android:layout_width="fill_parent"
            android:layout_height="350dp"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:layout_marginTop="10dp"
            android:clickable="true"
            android:columnWidth="80dp"
            android:drawSelectorOnTop="true"
            android:focusable="true"
            android:gravity="center"
            android:numColumns="auto_fit"
            android:smoothScrollbar="true"
            android:splitMotionEvents="true"
            android:stretchMode="columnWidth"
            android:verticalSpacing="5dp" />




and  textview that is :

 <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:layout_gravity="bottom"
        android:background="#55d3d3d3"
        android:gravity="center_vertical|center_horizontal"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:text="asdfasdadasds"
        android:textColor="#77FFFFFF" />