【问题标题】:Set Fixed GridView Row Height设置固定的 GridView 行高
【发布时间】:2013-05-29 16:19:30
【问题描述】:

我在 GridView 中遇到各种行高问题。

我想在 XML 中设置项目的大小(高度/宽度),然后让 GridView 自动调整尽可能多的项目,而无需拉伸。如果它不能适应下一个元素,它应该只在它能够适应的当前元素数量周围添加填充。

目前我得到 2 列(在我看来几乎是固定大小),并且行被拉伸。有人可以帮助解释正在发生的事情以及如何实现我想要的吗?

网格视图:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/main_grid"
    android:numColumns="auto_fit"
    android:gravity="center"
    android:paddingRight="20dp"
    android:paddingLeft="20dp"
    android:clipToPadding="true"
    android:fitsSystemWindows="true"
    android:stretchMode="none"
    android:background="@drawable/main_grid_background">

</GridView>

GridItem(我希望它是 320x320,因为我稍后会在其中插入一个背景图像,如果它不是一个完美的正方形,它看起来很奇怪)。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="320dp"
    android:layout_height="320dp"
    android:padding="10dp" >

    <TextView
        android:id="@+id/grid_item_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:text="@+id/label"
        android:layout_marginTop="5dp"
        android:textColor="@color/black"
        android:textSize="15sp"
        android:visibility="invisible"
        android:layout_centerInParent="true" >
    </TextView>

</RelativeLayout>

Java:

public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View gridView;

        if (convertView == null) {

            gridView = new View(context);

            // get layout from mobile.xml
            gridView = inflater.inflate(R.layout.main_grid_item, null);

        } else {
            gridView = (View) convertView;
        }
        TextView textView = (TextView) gridView
                .findViewById(R.id.grid_item_label);

            //SET TEXT AND BACKGROUND IMAGE HERE
            //gridView.setBackgroundResource(R.drawable.main_grid_item_import);



        return gridView;
    }

【问题讨论】:

  • 如果可能,请发布拉伸行的屏幕截图
  • @MehulJoisar 详情请参考图片。
  • android:stretchMode="spacingWidthUniform" 不是你想要的?
  • 这也适用于我的答案,但前提是我手动设置android:columnWidth="320dp",我希望不要手动设置。

标签: android android-gridview


【解决方案1】:

在自定义适配器中

v.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, rowHigh));

rowHigh 是你必须改变的维度

【讨论】:

  • 谢谢。根据应用程序的不同,您可能希望在 v.post(new Runnable...) 将 v 设置为 final 或等效的 ViewHolder 对象为 final 时调用它。我在一个单元格中有一个“关闭”按钮,它会自行删除(list.remove(position))并调用 notifyDataSetChanged()。只是简单的 setLayoutParams 对我起作用(渲染时间搞砸了)并将其放在后期修复它。
  • 具体来说,我相信它应该放在 getView() 或 newView() 中。请参阅文档中的示例:developer.android.com/guide/topics/ui/layout/…
【解决方案2】:

所以,这不是一个完美的答案,但这就是我让它工作的方式。从this线程借来的想法。

假设我知道我的图像尺寸为 320x320,所有这些都有效。此外,在 GridView 中我必须设置 android:columnWidth="320dp" 否则它将不起作用。如果有人有更好的想法,请发布...现在我继续前进。

网格项 XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="10dp" >
    <ImageView
    android:id="@+id/grid_item_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"/>
    <TextView
        android:id="@+id/grid_item_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:text="@+id/label"
        android:textColor="@color/black"
        android:layout_alignLeft="@+id/grid_item_image"
        android:layout_alignTop="@+id/grid_item_image"
        android:layout_alignRight="@+id/grid_item_image"
        android:layout_alignBottom="@+id/grid_item_image"
        android:gravity="center"
        android:textSize="15sp"
        android:visibility="invisible">
    </TextView>

</RelativeLayout>

GridView XML:

<GridView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/main_grid"
    android:numColumns="auto_fit"
    android:gravity="center"
    android:columnWidth="320dp"
    android:paddingRight="20dp"
    android:paddingLeft="20dp"
    android:clipToPadding="true"
    android:fitsSystemWindows="true"
    android:stretchMode="columnWidth"
    android:background="@drawable/main_grid_background">
</GridView>

【讨论】:

    【解决方案3】:
    public class MyGridView extends GridView {
        public MyGridView(Context context) {
            super(context);
        }
    
        public MyGridView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyGridView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int heightSpec;
    
            if (getLayoutParams().height == LayoutParams.WRAP_CONTENT) {
                // The great Android "hackatlon", the love, the magic.
                // The two leftmost bits in the height measure spec have
                // a special meaning, hence we can't use them to describe height.
                heightSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
            } else {
                heightSpec = heightMeasureSpec;
            }
    
            super.onMeasure(widthMeasureSpec, heightSpec);
        }
    
    
    }
    

    在 XML 中:

    <MyGridView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/main_grid"
        android:gravity="center"/>
    

    【讨论】:

    猜你喜欢
    • 2013-08-04
    • 2014-06-15
    • 2017-07-27
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    相关资源
    最近更新 更多