android gridview几个重要属性(android:listSelector自带内部padding分析)

一、android:scrollbarStyle  决定状态条的位置

常用属性outsideOverlay,滚动条在最外层,gridview设置的padding在滚动条的内侧

二、android:stretchMode  决定怎么分配剩余的空间

spacingWidth

     除去griditem和gridview的左右padding,剩余的空间totalSpace用中间的空余空间去扩充,这里的中间的分割空间总数n = columns - 1,这n个空间平分totalSpace

spacingWidthUniform

     除去griditem和gridview的左右padding,剩余的空间totalSpace用n= columns + 1个空间去平分。与spacingWidth的区别就是分割空间多了两个,就是Gridview左右两边分别有一个,而且还不包括padding。

columnWidth

     除去gridview的左右padding和horizontalspacing,用列的宽度去填满剩余空间,就是把剩余的空间平均分给每列的宽度。

三、android:listSelector   设置每个Item的按下效果,这个属性有点坑,具体如下解释

很多时候我们都会自定义gridview的每个Item的布局,点击效果也会使用自己的,不使用系统的。正常情况下如果自定义item比每个Gridview内部的item的要小,那么我们按下gridview的item时会响应系统的那个按下效果,但是如果我们自定义的item和gridview的item一样大,而且设置了点击事件,这个时候就点不中系统的按下效果了。 那么问题来了,本来视觉上没什么问题,但是我们发现gridview的两边多了一些padding(这里即使设置了gridview的padding,这个padding也会累加),原来发现系统默认的listSelctor自带有一个padding,这个padding会累加到gridview的padding上去。

解决上面问题的办法,自己设置一个listSelector去把系统的替换了。接下来看下这个listSelector怎么影响那个padding的。

1. 系统方法AbsListView的setSelector中设置了一个变量mSelectionRightPadding

public void setSelector(Drawable sel) {
    if (mSelector != null) {
        mSelector.setCallback(null);
        unscheduleDrawable(mSelector);
    }
    mSelector = sel;
    Rect padding = new Rect();
    sel.getPadding(padding);
    mSelectionLeftPadding = padding.left;
    mSelectionTopPadding = padding.top;
    mSelectionRightPadding = padding.right;
    mSelectionBottomPadding = padding.bottom;
    sel.setCallback(this);
    updateSelectorState();
}

2. AbsListView的onMeasure中改变了mListPading的值,这里真是fuck么,搞一个临时变量来改值,搞不懂要闹那样。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if (mSelector == null) {
        useDefaultSelector();
    }
    final Rect listPadding = mListPadding;
    listPadding.left = mSelectionLeftPadding + mPaddingLeft;
    listPadding.top = mSelectionTopPadding + mPaddingTop;
    listPadding.right = mSelectionRightPadding + mPaddingRight;
    listPadding.bottom = mSelectionBottomPadding + mPaddingBottom;
    // 省略其他代码
}

3. GridView的makeRow方法中把mListPading累加了

private View makeRow(int startPos, int y, boolean flow) {
    final int columnWidth = mColumnWidth;
    final int horizontalSpacing = mHorizontalSpacing;

    final boolean isLayoutRtl = isLayoutRtl();

    int last;
    int nextLeft;

    if (isLayoutRtl) {
        nextLeft = getWidth() - mListPadding.right - columnWidth -
        ((mStretchMode == STRETCH_SPACING_UNIFORM) ? horizontalSpacing : 0);
    } else {
        nextLeft = mListPadding.left +
        ((mStretchMode == STRETCH_SPACING_UNIFORM) ? horizontalSpacing : 0);
    }  // 这里累加了,顺便可以看到spacingWidthUniform熟悉的作用

    if (!mStackFromBottom) {
        last = Math.min(startPos + mNumColumns, mItemCount);
    } else {
        last = startPos + 1;
        startPos = Math.max(0, startPos - mNumColumns + 1);

        if (last - startPos < mNumColumns) {
            final int deltaLeft = (mNumColumns - (last - startPos)) * (columnWidth +                                        horizontalSpacing);
            nextLeft += (isLayoutRtl ? -1 : +1) * deltaLeft;
        }
    }
     // 省略其他代码
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏iOS开发攻城狮的集散地

iOS 获取gif图片循环次数和时长

2908
来自专栏MelonTeam专栏

Masonry源码阅读笔记——使用Block实现链式编程

导语 前段时间在阅读Masonry源码时,看到其内部使用了链式编程,比较有趣,这里简单分享一下; 在OC中实现链式编程并不难,最常用的实现是使用B...

1846
来自专栏跟着阿笨一起玩NET

WinForm中的简单打印

最近工作很是郁闷,有做WEB又要改桌面程序,要求之前基于DevExpress报表打印改成 DataGridView呈现数据 ,配置30分钟提醒用户打印,我发现我...

1042
来自专栏偏前端工程师的驿站

CSS魔法堂:"那不是bug,是你不懂我!" by inline-block

前言  每当来个需要既要水平排版又要设置固定高宽时,我就会想起display:inline-block,还有为了支持IE5.5/6/7的hack*display...

1978
来自专栏LinkedBear的个人空间

第一节Java入门课 原

一开始是一段很艰难的过程,因为学Java,就像尽快写程序,但Java不是一个很初级的技术,我们不得不理解一些概念。

773
来自专栏葡萄城控件技术团队

Table-values parameter(TVP)系列之三: 利用Collection将其作为参数传给SP

一,回顾 上一部分讲述了“在ADO.NET中利用DataTable对象,将其作为参数传给存贮过程”。 通过DataTable实例,完成了两部分的内容: ...

1759
来自专栏互联网开发者交流社区

FineUI控件集合

1337
来自专栏软件工程师成长笔记

基于MyBatis用mapper.xml文件配置执行任意字符串拼接sql语句

由于做的一个小项目里需要联动查询,一想16种情况,因为我是SSM框架写的,这样我就要写16个接口,16个实现,16条sql语句,想想就大头。既然数据库本身接收的...

3562
来自专栏天天

20171020

822
来自专栏MixLab科技+设计实验室

设计师编程指南之Sketch插件开发 9 之 Shape中的oval

往期文章索引: 1 / 入门基本概念、page的相关操作 2 / artboard 、NSFileManager 和 NSString 关于文件及文件夹的相关操...

2847

扫码关注云+社区