Grid View如何更改列号运行时?

时间:2012-10-30 04:52:36

标签: android android-layout gridview

我正在尝试更改gridView列号。我致电setNumColumn()invalidateViews()来更新视图。

但是,网格的单元格宽度不会动态变化。我设置了stretchMode="columnWidth",但它没有用。

screenshot

3 个答案:

答案 0 :(得分:3)

解决问题:

当网格视图在运行时更改列时,网格视图中的子视图不会重新计算其布局。

在BaseAdapter中,您应该调用forceLayout()来计算其布局。

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


    if (null == convertView) {
        convertView = mInflater.inflate(
                R.layout.mnm_customer_user_thumbnail, null);

        control.txtUserName = (TextView) convertView
                .findViewById(R.id.mnmTxtStudentName);
        control.image = (ImageView) convertView
                .findViewById(R.id.mnmImageStudent);
        control.imageCheckBox = (ImageView) convertView
                .findViewById(R.id.mnmImageCheckBox);
        control.mnmOuterBounder = (RelativeLayout) convertView
                .findViewById(R.id.mnmOuterBound);
        convertView.setTag(control);
    } else {
        convertView.forceLayout();
    }

...
...
...
...

由于

答案 1 :(得分:2)

可能您可以通过Google提供的这个漂亮的示例获得帮助 http://developer.android.com/shareables/training/BitmapFun.zip 以下代码位于ImageGridFragment.java中,用于在运行时动态处理列号更改,例如旋转设备时屏幕方向更改:

以下是注释:此侦听器用于获取GridView的最终宽度,然后计算列数和每列的宽度。每列的宽度都是可变的,因为GridView具有stretchMode = columnWidth。列宽用于设置每个视图的高度,因此我们获得了nic square缩略图。

mGridView.getViewTreeObserver().addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    if (mAdapter.getNumColumns() == 0) {
                        final int numColumns = (int) Math.floor(
                                mGridView.getWidth() / (mImageThumbSize + mImageThumbSpacing));
                        if (numColumns > 0) {
                            final int columnWidth =
                                    (mGridView.getWidth() / numColumns) - mImageThumbSpacing;
                            mAdapter.setNumColumns(numColumns);
                            mAdapter.setItemHeight(columnWidth);
                            if (BuildConfig.DEBUG) {
                                Log.d(TAG, "onCreateView - numColumns set to " + numColumns);
                            }
                        }
                    }
                }
            });

    return v;

答案 2 :(得分:0)

在xml中你必须提供这个属性..

 android:stretchMode="columnWidth" . In your adapter depending on the size(by  `getCount()`) of the list colomn will create dynamically..