6

我有以下 Gridview 代码(制作日历)。

    <GridView
    android:id="@+id/calendar"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_above="@+id/rl1"
    android:layout_below="@+id/ll2"
    android:columnWidth="250dp"
    android:numColumns="7" >
    </GridView>

Grid_Cell 如下。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/calendar_button_selector" >

<Button
    android:id="@+id/calendar_day_gridcell"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/calendar_button_selector"
    android:gravity="center"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="#000"
    android:textSize="14.47sp" >
</Button>

<TextView
    android:id="@+id/num_events_per_day"
    style="@style/calendar_event_style"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center" >
</TextView>

我想在行和列之间不设置空格。像这样

现有视图如下。

现有图像

请帮帮我...在此先感谢。

4

5 回答 5

4

我可能是错的,但据我所知,它GridView是一个AdapterView,在你的情况下,这意味着你不能通过 xml 动态地格式化你的项目的高度,以便它们总是填满整个父项。这不是网格视图(以及列表视图和其他适配器视图)的工作方式。

这种“可滚动的容器视图”可以看作是很久以前存在于“现代图书馆”中的缩微胶片阅读器。需要意识到数据实际上与实际查看器无关,您只需使用GridView带有修复和高度的查看器(在您的情况下)来平移也具有固定宽度和高度的底层数据项。

正如我所看到的,您正试图明确定位数据恰好与查看器窗口具有相同几何大小的极端情况。

不过,有一些提示:

您可以改为查看GridLayout. 是在 API 级别 14(IceCream Sandwich)中引入的GridLayout,因此您可能必须在那里重新考虑您的版本支持策略(如果我没有完全弄错,它也应该包含在 v7 支持包中,以便在旧平台上向后兼容,在这种情况下您可以简单地将 jar 添加到您的应用程序以支持较旧的 API 级别)。

另一个技巧是使用 aTableLayout与相应的表格行,而不是什么。从第一TableLayout天开始就已经存在,因此不存在向后兼容性问题,但它们确实倾向于变得非常密集布局。如果您打算大量重新加载视图或在几个月之间顺利滚动,我不确定这是否适合您(由于深度布局路线的数量)。

第三种解决方案是您仍然使用GridView,但您测量它的高度并根据测量的高度从您的网格视图适配器动态设置您膨胀的网格视图项目的固定GridView高度(换句话说:您确保您输入上面提到的极端情况)。

如果您使用,GridView您还需要摆脱垂直间距。有一个你可以玩弄android:stretchMode的属性。您还可以在属性上尝试不同的(负数?)维度。GridViewandroid:verticalSpacing

祝您的自定义日历视图好运!

于 2012-12-05T13:56:48.313 回答
4

我会尝试给你一个片段,但老实说,没有必要为你的情况使用 GridView,因为无论如何你的所有项目都在屏幕上。LinearLayout您可以在一个小循环中创建几个s 来获得结果。

我建议您根据屏幕宽度在运行时设置 columnWidth。

并且当膨胀子视图时,您的适配器应该提供列宽和高度来设置它们。在这种情况下,您需要摆脱 numColumns。请记住,将 numColumns 与 columnWidth 一起使用是没有意义的,尤其是当您想要填充整个空间时。如果要设置 numColumns,请删除 columnWidth。

解决方案

结果如下: 在此处输入图像描述 首先,我们创建布局。就我而言,它是MainActivity的布局,被称为activity_main.xml. (请注意没有 GridView,因为我稍后会在代码中添加它):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/header"
        android:background="#444"
        android:gravity="center"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="@android:color/white"
        android:text="Dynamic Static GridView" />

    <TextView
        android:id="@+id/footer"
        android:gravity="center"
        android:background="#444"
        android:textColor="@android:color/white"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Shush" />

</RelativeLayout>

我们的 GridView 元素的布局位于item_grid.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="#fff"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

现在诀窍在 MainActivity 中(我已经注释了一些代码供您理解):

包 com.example.dynamicstaticgridview;

import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.RelativeLayout;
import android.app.Activity;
import android.graphics.Color;

/**
 * @author Sherif elKhatib
 *
 */
public class MainActivity extends Activity {

    private static String items[]; //these are temporary items :p do not use them
    static {
        items = new String[7*7];
        for(int i=0;i<7*7;i++) {
            items[i] = String.valueOf(i);
        }
    }

    int numberOfColumns = 7; //defaulting to 7, you can change it when you know
    int numberOfRows = 7; //defaulting to 7, you can change it when you know
    GridView mGrid;
    ArrayAdapter<String> mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
        params.addRule(RelativeLayout.BELOW, R.id.header);
        params.addRule(RelativeLayout.ABOVE, R.id.footer);
        mGrid = new GridView(this) {
            @Override
            protected void onLayout(boolean changed, int l, int t, int r, int b) {
                super.onLayout(changed, l, t, r, b);
                if(!calculated)
                    getDimens();
            }
        };
        mGrid.setVerticalSpacing(0);
        mGrid.setHorizontalSpacing(0);
        mGrid.setStretchMode(GridView.NO_STRETCH);
        mGrid.setBackgroundColor(Color.rgb(100, 10, 10));
        ((RelativeLayout)findViewById(R.id.rootview)).addView(mGrid, params);
    }

    private int mCellWidth;
    private int mCellHeight;
    boolean calculated = false;
    protected void getDimens() {
        calculated = true;
        //here you might have some rounding errors
        //thats why you see some padding around the GridView
        mCellWidth = mGrid.getWidth()/numberOfColumns;
        mCellHeight = mGrid.getHeight()/numberOfRows;
        mGrid.setColumnWidth(mCellWidth);
        mGrid.setNumColumns(numberOfColumns);
        mAdapter = new ArrayAdapter<String>(this, R.layout.item_grid, R.id.text, items) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                GridView.LayoutParams params = null;
                if(convertView == null) {
                    params = new GridView.LayoutParams(mCellWidth, mCellHeight);
                }
                convertView = super.getView(position, convertView, parent);
                if(params != null) {
                    convertView.setLayoutParams(params);
                }
                return convertView;
            }
        };
        mGrid.setAdapter(mAdapter);
    }
}

评论:你最好找到一个合适的算法来选择mCellWidth, mCellHeight,numberOfColumnsnumberOfRows

于 2012-12-12T08:40:35.583 回答
2

如果你想给你的gridview一个高度和宽度,在gridview之外放置一个相对布局,并将android:layout_width和android:layout_height给你的相对布局。然后将您的gridview 的宽度和高度提供给match_parent。之后,如果您想首先为您的 gridview 单元格元素提供精确的高度和宽度,您必须知道所有单元格的确切宽度和高度,并且您应该据此定义 columnWidth,例如对于此代码

 <GridView
android:id="@+id/calendar"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@+id/rl1"
android:layout_below="@+id/ll2"
android:columnWidth="250dp"
android:numColumns="7" >
</GridView>

如果你在外面没有 1000dp 布局,你永远不会在一个好的视图中在一行中得到 4 个单元格,但只有 gridview 会尝试确定它自己的单元格宽度。

对于您的情况,您的日历网格视图应该是这样的:

<GridView
android:id="@+id/calendar"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@+id/rl1"
android:layout_below="@+id/ll2"
android:columnWidth="50dp"
android:numColumns="7" >
</GridView>
于 2012-12-07T18:42:48.337 回答
2

这似乎是您的解决方案http://www.anddev.org/how_to_display_gridview_with_gridlines_and_borders-t11099.html

于 2012-12-11T11:27:31.290 回答
1

尝试在 XML 中为您设置这两个值GridView

android:horizontalSpacing="0dp"
android:verticalSpacing="0dp"

您可能希望删除该android:columnWidth字段。

于 2012-12-07T17:47:30.433 回答