我想删除网格视图中显示的额外填充。我有大小128 * 128的图像,它将占用网格中的单元格。但不知何故,有一个额外的空间被添加到网格的内容。
经过一番研究,我能够确定我必须覆盖网格视图的listSelector属性。现在这是我的问题 - 我知道我必须在这里指定像xml drawable这样的东西,但是要指定什么?我尝试使用带有填充和行程设置为0dp的形状可绘制无效。
提出问题并回答here,但他们没有给出必须包含的内容。
有人可以帮助我。谢谢!
编辑:好的 - here是我拥有的用户界面的副本。并且XML布局如下:
<GridView android:id="@+id/GV_A2ZMenu" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:numColumns="4"
android:layout_gravity="top" android:stretchMode="columnWidth"
android:gravity="center" android:listSelector="@null" />
我正在使用BaseAdapter类来填充gridView。这是它的代码:
public class AtoZMenu extends BaseAdapter {
private static Context AppC;
private Integer[] MenuImg = { R.drawable.alphabet_a, R.drawable.alphabet_b,
R.drawable.alphabet_c, R.drawable.alphabet_d,
R.drawable.alphabet_e, R.drawable.alphabet_f,
R.drawable.alphabet_g, R.drawable.alphabet_h,
R.drawable.alphabet_i, R.drawable.alphabet_j,
R.drawable.alphabet_k, R.drawable.alphabet_l,
R.drawable.alphabet_m, R.drawable.alphabet_n,
R.drawable.alphabet_o, R.drawable.alphabet_p,
R.drawable.alphabet_q, R.drawable.alphabet_r,
R.drawable.alphabet_s, R.drawable.alphabet_t,
R.drawable.alphabet_u, R.drawable.alphabet_v,
R.drawable.alphabet_w, R.drawable.alphabet_x,
R.drawable.alphabet_y, R.drawable.alphabet_z };
public AtoZMenu(Context C) {
AppC = C;
}
public int getCount() {
return MenuImg.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView IV;
float density = AppC.getResources().getDisplayMetrics().density;
if (convertView == null) {
IV = new ImageView(AppC);
IV.setMaxHeight((int) (1));
} else {
IV = (ImageView) convertView;
}
IV.setImageResource(MenuImg[position]);
return IV;
}
}
你能发现错误吗?
注意:最后,我最终在表格布局中实现了一个类似的屏幕,这样可以提供更好的网格。
答案 0 :(得分:37)
<!-- Setting the listSelector to null removes the 5px border -->
<GridView
android:id="@+id/view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:listSelector="@null" />
另外,请尝试以下方法:
myGridView.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
我看到你可以在XML中做到这一点,但是当我遇到同样的问题时我没有这样做;不知道为什么。
我还对密钥高度进行了硬编码:
float density = getContext().getResources().getDisplayMetrics().density;
mKeyHeight = (int) (56 * density);
....
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageButton b = (ImageButton) convertView;
if (b == null) {
b = new ImageButton(getContext());
b.setMinimumHeight(mKeyHeight);
b.setBackgroundResource(R.drawable.btn_keyboard_key);
b.setOnClickListener(this);
}
}
很抱歉没有给出确切的答案,所以如果您在那之后仍然需要帮助,请告诉我。
答案 1 :(得分:2)
正确答案是将android:listSelector
设置为@android:color/transparent
,因为用户 mvds 表示here。
答案 2 :(得分:1)
我使用了Shawn的解决方案的变体..它在模拟器上看起来不错。
1)决定列数,我选择了4个
2)设置列宽
float xdpi = this.getResources().getDisplayMetrics().xdpi;
int mKeyHeight = (int) ( xdpi/4 );
GridView gridView = (GridView) findViewById(R.id.gridview);
gridView.setColumnWidth( mKeyHeight );// same Height & Width
3)在适配器的getView方法中设置图像
imageView = new ImageView( mContext );
// (xdpi-4) is for internal padding
imageView.setLayoutParams(new GridView.LayoutParams( (int) (xdpi-4)/2, (int) (xdpi-4)/2));
imageView.setScaleType( ImageView.ScaleType.CENTER_CROP );
imageView.setPadding(1, 1, 1, 1);
4)布局
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numColumns="4"
android:verticalSpacing="0dp"
android:horizontalSpacing="0dp"
android:gravity="center"
android:listSelector="@null"
/>
<!--
android:columnWidth="90dp" Specified in code
android:stretchMode="columnWidth" no noticable change
-->
就是这样。
答案 3 :(得分:1)
即使我遇到同样的问题。 试试这个:
image.setLayoutParams(new GridView.LayoutParams(imageWidth , imageHeight));
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
。
为图像添加相应的填充。它对我有用。
答案 4 :(得分:0)
我遇到了类似的问题,但在我的情况下,我的GridView
底部有一个相当大的填充区域(它充满了背景颜色)。
我没有在这里看到我的问题的解决方案,所以我会在这里发布,以防它有用。
除了设置:
android:listSelector="@null"
在我的GridView中,我还必须设置:
android:fadingEdgeLength="0px"
或者,在Java中:
GridView.setFadingEdgeLength(0);