我有以下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>
我想在行和列之间不设置空格。
现有视图如下。
请帮帮我......先谢谢
答案 0 :(得分:4)
我可能错了,但据我所知,GridView
是AdapterView
,在您的情况下意味着您无法动态地通过xml格式化项目的高度这样他们总是填满整个父母。这不是网格视图(以及列表视图和其他适配器视图)的工作方式。
这种“可滚动容器视图”可以看作microfilm readers,它曾经很久以前就存在于“现代图书馆”中。我们需要意识到数据实际上与实际的观察者无关,你只需使用你的观察者(在你的情况下为GridView
)并使用修复和高度来平移下面的数据项,这些数据项也有它们的修正宽度和高度。
正如我所看到的那样,你正试图明确地定位一个角落情况,在这种情况下,数据恰好与观察者窗口具有相同的几何尺寸。
但有一些提示:
您可以改为查看GridLayout
。 {1}}是在API级别14(IceCream Sandwich)中引入的,因此您可能需要重新考虑您的版本支持策略(如果我没有完全错误,它也应该包含在v7支持包中,以便在旧版本上向后兼容平台,在这种情况下,您只需将jar添加到您的应用程序以支持较旧的API级别。
另一个提示是使用TableLayout
和相应的表格行,而不是。 GridLayout
从第一天起就已存在,因此没有向后的可兼容性问题,但它们确实会变得非常布局密集。如果您计划重新加载视图或顺利滚动几个月,我不确定这是否适合您(由于深度布局路径的数量)。
第三个解决方案是你仍然使用TableLayout
,但是你可以测量它的高度,并根据测量的{{动态设置网格视图适配器中膨胀的网格视图项的修复高度。 1}}高度(换句话说:你确保输入上面提到的角落)。
如果你使用GridView
,你也需要摆脱垂直间距。 GridView
上有一个GridView
属性,您可以play around with。您还可以在android:stretchMode
属性上尝试不同的(负?)维度。
祝你的自定义日历视图好运!
答案 1 :(得分:4)
我会尝试给你一个片段,但说实话,没有必要为你的情况使用GridView,因为无论如何你的所有项目都在屏幕上。您可以在一个小循环中创建几个LinearLayout
,以获得结果。
我建议你根据屏幕宽度在运行时设置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(我已经评论了一些代码供您理解):
package 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
,numberOfColumns
和numberOfRows
。
答案 2 :(得分: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应该是这样的:
<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>
答案 3 :(得分:2)
答案 4 :(得分:1)
尝试使用XML为GridView
设置这两个值:
android:horizontalSpacing="0dp"
android:verticalSpacing="0dp"
您可能希望删除android:columnWidth
字段。