zoukankan      html  css  js  c++  java
  • Android GridView设置行数

    普通的做法是设置一个高度,然后里面能显示出来几行就是几行,如果里面的内容高度变了,就需要重新调整高度来适配。

    观察了一下它的onMeasure

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    
    .....
    
    if (heightMode == MeasureSpec.AT_MOST) {
        int ourSize =  mListPadding.top + mListPadding.bottom;
       
        final int numColumns = mNumColumns;
        for (int i = 0; i < count; i += numColumns) {
            ourSize += childHeight;
            if (i + numColumns < count) {
                ourSize += mVerticalSpacing;
            }
            if (ourSize >= heightSize) {
                ourSize = heightSize;
                break;
            }
        }
        heightSize = ourSize;
    }
    ...
    
    }

    发现,如果是它设置wrap_content,可以通过改变它的adapter来确定行数,具体方法如下是:

    MyAdapter

    @Override
        public int getCount() {
            if (mIsOnMeasure && super.getCount() >MAX_COUNT) {
                return MAX_COUNT;
            }
            return super.getCount();
        }
    
    
        public void setOnMeasureStatus(boolean isOnMeasure) {
            mIsOnMeasure = isOnMeasure;
        }
    
    
    
    
    
    Gridview- >
    
    @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int heightMode = MeasureSpec.getMode(heightMeasureSpec);
            if (heightMode == MeasureSpec.AT_MOST) {
                ((MyAdapter) getAdapter()).setOnMeasureStatus(true);
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
                int height = getMeasuredHeight();
                ((FolderAdapter) getAdapter()).setOnMeasureStatus(false);
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
                setMeasuredDimension(getMeasuredWidthAndState(),
                        MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
            } else {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            }
        }

    在onMeasure的时候,先让adapter假装有行数×列数的内容,调用 super.onMeasure先算出一个高,这个就是期望高度。

    然后在调用一次  super.onMeasure(widthMeasureSpec, heightMeasureSpec),把整个view绘制出来
    最后通过setMeasuredDimension就可以做到了。

  • 相关阅读:
    Python中把数据存入csv文件
    Python中把字典和值取出来
    scrapy输出请求状态码
    scrapy发送post请求获取cookie
    Python3 Unicode转中文
    Quartus13.0破解方法
    元音字母A的发音规则
    位bit——字节Byte???
    曾经的小孩在努力奔跑!
    如何看懂的时序图?
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/9877563.html
Copyright © 2011-2022 走看看