在android中删除GridView中的额外填充

时间:2011-07-29 17:36:15

标签: android gridview cellpadding

我想删除网格视图中显示的额外填充。我有大小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;
}
 }

你能发现错误吗?

注意:最后,我最终在表格布局中实现了一个类似的屏幕,这样可以提供更好的网格。

5 个答案:

答案 0 :(得分:37)

是的,我遇到了同样的问题。您想将listSelector设置为@null:

<!-- 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);