精华内容
下载资源
问答
  • //前段时间有个做Java同事问我谷歌优化怎么做,什么是黑帽什么是白帽... 谷歌优化有100多种规则,简单的列出几个关键步骤: 谷歌蜘蛛——》 网址(URL)——》内容(标题,关键词,描述)——》收录——》索引——...

          // 前段时间有个做Java的同事问我谷歌优化怎么做,什么是黑帽什么是白帽? 我为此出了一篇文章,欢迎借鉴和探讨

    1,什么是谷歌收录,该怎么做呢 ?

          谷歌先有收录才会有排名,从而达到自然排名的效果,也就是常说的优化。

          谷歌优化有100多种规则,简单的列出几个关键步骤:  谷歌蜘蛛——》 网址(URL)——》内容(标题,关键词,描述)——》收录——》索引——》参与排名——》吸引点击。

    谷歌收录是指:

    Google有没有将你的网页,放入自己的数据库。这样可以在谷歌优化的时候,达到可以通过自然流量搜索到你,并且产生流量,访客等目的。在过去的几年,也就是Google缺数据的时候,你的谷歌收录是越多越好的。但是在14年之后,Google搜索引擎是不缺数据的,谷歌收录更倾向于有价值的页面,可以帮用户处理问题的页面,新需求内容,新热点内容的处理。也就是14年之后,尤其是近两年,Google收录更倾向于,有价值的好内容。

            反观网站也是,你网站被Google收录的页面,多能处理用户需求,而不是毫无价值的重复页面,这样你网站整体流量和排名都会好一些。

         网站被谷歌收录之后会一直保持在谷歌首页,轻易的不会掉下去,被谷歌收录之后还有个好处就是,一但被谷歌首页,在其他的搜索引擎也是可以搜到的。

       亲身经历:关于网站的SEO,网站主推几个关键词,搜那个关键词,谷歌百度都在首页,都在第一位(没广告位的前提下),但是有一次,网站的一个jar包解析出问题了,百度上的收录直接为0,网站能打开,但是在百度的收录全没了,搜什么都搜不到了,但是我打开谷歌,搜主推的词,还是在第一位。谷歌的算法还是比较复杂的,已经深度收录了,基本上掉不下去。

    想要优化到谷歌首页 ,傻瓜式操作的方法,即实用也有效果的一个办法: 在网站添加内容,一周更新2-3次新闻,网站内容越多就越容易被谷歌收录,谷歌爬虫可是很厉害的,最好是定期更新,给谷歌爬虫形成一个生物钟。

     

     

    下一期更新:谷歌白帽黑帽的区别和用途

    展开全文
  • 7.4.2按位置进行合并计算 如果所有...7.4.3按分类进行合并计算 如果需要合并各个工作表中数据区域具有相同行标题或列标题但它们以不同方式组织比如位置不同或者顺序不同则可按分类进行合并计算 7.5 数据
  • 有很多的贴子在介绍的时候没有严格的区分,命名介绍的是列转行该如何操作,但是帖子的标题确写的是行转。自始至终都没有提过转行的事情。所以,我觉的这里应该有必要做一次区别和认识。 什么是行转 所谓的行转...

    行转列与列转行的概念

    这里需要重申一下行转列和列转行的区别。有很多的贴子在介绍的时候没有严格的区分,命名介绍的是列转行该如何操作,但是帖子的标题确写的是行转列。自始至终都没有提过列转行的事情。所以,我觉的这里应该有必要做一次区别和认识。

    什么是行转列

    所谓的行转列是指把数据表中具有相同key值的多行value数据,转换为使用一个key值的多列数据,使每一行数据中,一个key对应多个value。

    行转列完成后,在视觉上的效果就是:表中的总行数减少了,但是列数增加了。

    如下所示的转换过程就是一个简单的行转列的过程:
    在这里插入图片描述

    什么是列转行

    所谓的列转行是指把表中同一个key值对应的多个value列,转换为多行数据,使每一行数据中,保证一个key只对应一个value。

    列转行完成之后,在视觉上的效果就是:表中的列数减少了,但是行数增加了。

    如下所示的转换过程就是一个简单的列转行过程:
    在这里插入图片描述

    行转列实验示例

    在进行实验之前,我们需要先准备好我们的实验环境,准备好表和表中的初始化数据。

    • 准备初始化表结构
    CREATE TABLE `student_x` (
      `id` int(11) DEFAULT NULL,
      `name` varchar(255) DEFAULT NULL,
      `class` varchar(255) DEFAULT NULL,
      `score` int(255) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    • 准备初始化表中的数据
    INSERT INTO `student_x`(`id`, `name`, `class`, `score`) VALUES (1, '张三', '数学', 78);
    INSERT INTO `student_x`(`id`, `name`, `class`, `score`) VALUES (2, '张三', '英语', 93);
    INSERT INTO `student_x`(`id`, `name`, `class`, `score`) VALUES (3, '张三', '语文', 65);
    INSERT INTO `student_x`(`id`, `name`, `class`, `score`) VALUES (4, '李四', '数学', 87);
    INSERT INTO `student_x`(`id`, `name`, `class`, `score`) VALUES (5, '李四', '英语', 90);
    INSERT INTO `student_x`(`id`, `name`, `class`, `score`) VALUES (6, '李四', '语文', 76);
    INSERT INTO `student_x`(`id`, `name`, `class`, `score`) VALUES (7, '李四', '历史', 69);
    
    • 进行行转列的实验环境最后如下所示:
      在这里插入图片描述

    示例:使用聚合函数

    我们在这个示例中,使用聚合函数sum、max、min、avg来完成我们的行转列的需求,具体的实验如下。

    • 下面是我们需要完成行转列的效果图:
      在这里插入图片描述
    • 使用case when语句来拼装新的数据列
    select name,
    	case when class = '数学' then score else null end as math_score,
    	case when class = '英语' then score else null end as engilsh_score,
    	case when class = '语文' then score else null end as chinese_score,
    	case when class = '历史' then score else null end as history_score
    from student_x;
    

    在这里插入图片描述

    • 基于上面的效果图,我们需要把数据结果,按照name列进行聚合,让姓名相同的数据行合并为同一行来展示,同时,每一列的科目中,只有一行数据是有成绩的,其他行成绩都是空null,所以他们结合使用max函数,可以达到合并行,并且每列的科目成绩不会因为合并行而影响到最后的每一科目的成绩。实现上述转换的SQL语句如下:
    select name,
    	max(case when class = '数学' then score else null end) as math_score,
    	max(case when class = '英语' then score else null end) as engilsh_score,
    	max(case when class = '语文' then score else null end) as chinese_score,
    	max(case when class = '历史' then score else null end) as history_score
    from student_x
    group by name;
    

    在这里插入图片描述

    • 我们上面使用了case when语句来判断,其实if语句也可以达到case when语句的效果。如下是使用if语句的结果:
    select name,
    	max(if(class = '数学', score, null)) as math_score,
    	max(if(class = '英语', score, null)) as engilsh_score,
    	max(if(class = '语文', score, null)) as chinese_score,
    	max(if(class = '历史', score, null)) as history_score
    from student_x
    group by name;
    

    在这里插入图片描述

    • 实现过程分析
    1. 这里我们使用了聚合函数max,把每一个学生的姓名作为key,进行分组统计。
    2. 因为每一个学生对应每一门科目的成绩只有一行记录,所以我们使用聚合函数sum统计后的每一科目的成绩,仍然是该科目单独的成绩。
    3. 如果这里每一个学生对应每一门科目有多个成绩记录,这里就不能使用聚合函数max了,如果使用max,最后的结果将是每一个学生对应每一门科目成绩的最大值。
    4. 这里之所以使用max的目的是为了达到一个分组的效果。这里的max可以使用sum、min、avg等聚合函数替换掉,它们三个的效果和sum函数的效果在这里是一样的。

    总结:上面的这样的实现方式,使大家经常使用的,也是大家最熟悉的一种方式。但是这样的写法有一个问题,就是当我们的科目名称变动或者增加或者减少的时候,我们SQL语句也需要作出对应的修改。因为我们在SQL语句中已经使用了hard code硬编码的方式把科目的名称给写死了,所以这样的SQL不太灵活。

    我们可以参考使用下面的几种写法,每一种写法稍微有点不同,但是这些方式基本都能满足我们的需求。

    列转行实验示例

    在进行列转行的实验之前,我们需要先准备好我们的实验环境,准备好表和表中的初始化数据。表结构和初始化数据如下:

    • 准备初始化表结构
    CREATE TABLE `student_y` (
      `id` int(11) DEFAULT NULL, 
      `name` varchar(255) DEFAULT NULL,
      `math_score` bigint(255) DEFAULT NULL,
      `engilsh_score` bigint(255) DEFAULT NULL,
      `chinese_score` bigint(255) DEFAULT NULL,
      `history_score` bigint(255) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    • 准备初始化表中的数据
    INSERT INTO `student_y`(`id`, `name`, `math_score`, `engilsh_score`, `chinese_score`, `history_score`) VALUES (1, '张三', 78, 93, 65, NULL);
    INSERT INTO `student_y`(`id`, `name`, `math_score`, `engilsh_score`, `chinese_score`, `history_score`) VALUES (2, '李四', 87, 90, 76, 69);
    
    • 进行列转行的实验环境最后如下所示:
      在这里插入图片描述

    示例:使用union all功能

    实验环境准备后之后,接下来我们开始使用union all的功能来实现列转行的功能。

    • 下面是我们需要完成行转列的效果图: 在这里插入图片描述
    • 我们可以对所有学生的每一个科目的成绩进行单独查询,结果如下:
    select name, math_score as score from student_y;
    select name, engilsh_score as score from student_y;
    select name, chinese_score as score from student_y;
    select name, history_score as score from student_y;
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    • 基于上面的每一个查询结果,把最后的结果使用union all关键词合并在一起,效果如下:
    select name, math_score as score from student_y
    union all
    select name, engilsh_score as score from student_y
    union all
    select name, chinese_score as score from student_y
    union all
    select name, history_score as score from student_y;
    

    在这里插入图片描述

    • 此时,我们发现结果中已经大概实现了列转为行的需求。但是顺序没有达到要求,每个人的各个科目的成绩应该挨着,但是目前是没有挨着的。所以我们需要在基于上面的查询结果,外面在包裹一层查询,增加一个order by语句在外层查询中,即可得到我们想要的顺序。如下所示:
    select * from (
    	select name, math_score as score from student_y
    	union all
    	select name, engilsh_score as score from student_y
    	union all
    	select name, chinese_score as score from student_y
    	union all
    	select name, history_score as score from student_y
    ) as x order by name;
    

    在这里插入图片描述

    • 此时的结果已经很接近我们的最后想要的结果了,但是我们发现,每个学生的成绩我们不能区分各个科目的成绩是多少,所以我们需要把科目也纳入到结果集中,也就是我们在查询的时候,要把各个成绩对应的列名称也包含到查询的字段中。于是就有了如下的SQL
    select * from (
    	select name, 'math_score' as class, math_score as score from student_y
    	union all
    	select name, 'engilsh_score' as class, engilsh_score as score from student_y
    	union all
    	select name, 'chinese_score' as class, chinese_score as score from student_y
    	union all
    	select name, 'history_score' as class, history_score as score from student_y
    ) as x order by name,class;
    

    在这里插入图片描述
    总结:这里我们采用了union all的功能,把所有学生每个科目的成绩单独查询出来,然后把结果集继续合并。最后达到我们想要的列转为行的效果。但是我们发现此时的SQL语句中,和前面我们在进行行转列的时候,使用聚合函数的方式来实现行转列的方式类似,使用了hard code的硬编码,如果科目名称或数目发生改变,我们的SQL语句也需要跟着动态的去修改,这是这种方式的缺陷。但是优点就是比较容易理解。

    最后总结

    我们在文章的开始,首选针对行和列相互转行的概念做了简单澄清,因为有很多人会把行转列和列转行给混淆。行转列和列转行的最明显的区分如下:

    行转列,最后的结果中行变少了,列变多了。
    列转行,最后的结果中列变少了,行变多了。
    紧接着,我们分别针对行转列和列转行进行了实验演示。

    展开全文
  • 目录 前言 题解 滑动窗口 拥挤的奶牛 ...单调指的是这个对的性质,那什么是单调呢?举个例子:一个序列:5 4 3 2 1我们就可以说它是单调递减的,1 2 3 4 5也是一个单调序列,不过它是单调...

    目录

    前言

    题解

    滑动窗口

    拥挤的奶牛

    后记 


    前言

    我相信你是被我优秀的标题吸引,或是想认真地学习一下单调队列的态度进来的。不管怎样,我都不会让你们失望。

    先来简单介绍一下单调队列:

    单调队列,从字面意思来看,即单调的队列。单调指的是这个对列的性质,那什么是单调呢?举个例子:一个序列:5 4 3 2 1我们就可以说它是单调递减的,1 2 3 4 5也是一个单调序列,不过它是单调上升的。 5 2 3 4 1显然不是;那么单调队列有什么用呢?它最重要的用途就在于可以大幅优化程序的时间复杂度,包括优化DP(多重背包。。。)。可以说,学习单调队列是对我们学习更高级算法的阶梯,也是在比赛中优化单调队列的必需品;

    说了这么多,我们在来讲一下怎么维护一个队列的单调性。我们都知道,队列的特性便是先进先出,这里我们用双向队列举例子,它既可以“pop”掉队头元素,也可以pop队尾元素,相当于队列+栈。我们来看一个代码(维护一个有n个元素的队列的单调性)

    for(int i=1;i<=n;i++) {//a数组为输入的元素,双向队列q
            while(!q.empty() && q.back()<=a[i])//维护队列的单调性,如果队尾比当前元素小,就弹出队尾
                                               //这样整个队列从队头到队尾都是单调下降的
                q.pop_back();
            q.push_back(a[i]);//插入当前元素
            cout<<q.front();//因为队列是单调下降的,所以队头是当前所有元素的最大值
        }

    你可能会说,这并没有意义,找一个序列的最大值直接查找也能找到。确实,但在某些情况下,直接查找的复杂度是指数级的,而单调队列确实O(1)的。下面就让我们进入今天的第一题:滑动窗口.

    题解

    滑动窗口

    洛谷 P1886 滑动窗口

    题目描述

    给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,如下图:  你的任务是找出窗体在各位置时的最大值和最小值。

    输入

    第1行:2个整数N,K(K<=N<=1000000) 第2行:N个整数,表示数组的N个元素(<=2*10^9)

    输出

    第1行:滑动窗口从左向右移动每个位置的最小值,每个数之间用一个空格分开 第2行:滑动窗口从左向右移动每个位置的最大值,每个数之间用一个空格分开

    样例输入

    8 3
    1 3 -1 -3 5 3 6 7

    样例输出

    -1 -3 -3 -3 3 3
    3 3 5 5 6 7

    此题,意思很简单就是让你求特定区间长度内的最大元素与最小元素。很容易想到爆力的解法:枚举。只需要一个i从1到n-k,再在第二重循坏循坏k次找最大元素和最小元素。但这种方法显然是不可行的,此种算法的时间复杂度为NK的,可以近似理解为N^{2},(K<=N<=1000000)。

    既然这样,我们就该想想优化的算法了。来说说我一开始看到这道题的想法:枚举显然不可取;但可以先找出1-k这个区间内的最大元素和最小元素(maxi,mini)。然后i从k+1开始,当a[i]小于mini或a[i]大于maxi,就把maxi(mini)赋成a[i],最后用数组存储起来输出;初看这个想法并没有错,时间复杂度也是O(N)的。但,这个想法却有问题,这样子做只能找到前i个数组元素的最大值,并没有考虑到区间这个要求,这时的maxi已经不起作用了,因为他已经处在这个区间之外,是无效的。

    怎么改进?我们可以这样想,当这个窗口滚动时,我们把这些元素存储起来,并用上述维护单调队列的方式让这个队列是递减的。这样他的队头就是最大值。我们只需用一个while循环判断队头是否在这个区间之外,如果是就弹出队列。而此时队头的元素可以保证是这个区间的最大值;

    代码如下:

    #include <iostream>
    #include <queue>
    #include <cstdio>
    
    using namespace std;
    
    #define inf 0x7f7f7f7f
    #define N 1000001
    
    struct node {//单调队列的结构体
        int a,num;//num为位置,用来判断是否超出区间
    };
    
    int read() {
        int f=1,s=0;char a=getchar();
        while(!(a>='0'&&a<='9')) {if(a=='-') f=-1 ; a=getchar(); }
        while(a>='0'&&a<='9') {s=s*10+a-'0'; a=getchar();}
        return f*s;
    }
    
    int k,n,t[N],p1,p2;
    deque<node> q1,q2;
    
    int main() {
        n=read();k=read();
        for(int i=1;i<=n;i++)
            t[i]=read();
        for(int i=1;i<=n;i++) {//找区间最小值
            while(!q1.empty() && q1.front().num<=i-k)//判断是否超出区间
                q1.pop_front();
            while(!q1.empty() && q1.back().a>t[i])//维护单调队列
                q1.pop_back();
            node g;
            g.a=t[i];
            g.num=i;
            q1.push_back(g);
            if(i>=k) {//输出结果
                if(p1==1)
                    cout<<' ';
                cout<<q1.front().a;
                p1=1;
            }
    
        }
        cout<<endl;
        for(int i=1;i<=n;i++) {//找区间最大值,同上
            while(!q2.empty() && q2.front().num<=i-k)
                q2.pop_front();
            while(!q2.empty() && q2.back().a<t[i])
                q2.pop_back();
            node g;
            g.a=t[i];
            g.num=i;
            q2.push_back(g);
            if(i>=k) {
                if(p2==1)
                    cout<<' ';
                cout<<q2.front().a;
                p2=1;
            }
        }
        return 0;
    }
    

    拥挤的奶牛

    看了滑动窗口,我们再来看看它的一道拓展题:

    题目描述

    FJ的n头奶牛(1<=n<=50000)在被放养在一维的牧场。第i头奶牛站在位置x(i),并且x(i)处有一个高度值h(i)(1<=x(i),h(i)<=1000000000)。

    一头奶牛感觉到拥挤当且仅当它的左右两端都有一头奶牛所在的高度至少是它的2倍,且和它的距离最多为D。尽管感到拥挤的奶牛会产生更少的牛奶,FJ还是想知道一共有多上感到拥挤的奶牛。请你帮助他。

    输入

    第一行:两个整数n和D。

    第二行到第n+1行:每一行有两个数表示x(i)和h(i)。

    输出

     一个数k表示感到拥挤的奶牛的数量。

    样例输入

    6 4
    10 3
    6 2
    5 3
    9 7
    3 6
    11 2
    

    样例输出

    2

    为什么我要把这道题拿到一起讲,因为我拿到这道题时第一眼就想到了滑动窗口,它与滑动窗口十分相似,但也有些细节需要考虑;给两个提示,剩下的留给你们考虑;

    1.此题需要维护两个区间的最大值;并且区间是否弹出是跟据x(奶牛的位置)来的。

    2.可以用两个数组来存储左边d个元素的最大值和右边d个元素的最大值。最后来比较,得出答案。

    代码如下:

    #include <iostream>
    #include <cstdio>
    #include <queue>
    #include <algorithm>
     
    using namespace std;
     
    #define N 50100
    #define inf 0x7f7f7f7f
     
    int read() {
        int f=1,s=0;char a=getchar();
        while(!(a>='0'&&a<='9')) {if(a=='-') f=-1 ; a=getchar(); }
        while(a>='0'&&a<='9') {s=s*10+a-'0'; a=getchar();}
        return f*s;
    }
     
    struct node {
        int x,h;
    }a[N];
     
    bool cmp (node a,node b) {
        return a.x<b.x;
    }
     
    deque<node> q1,q2;
    int k,ans,max1[N],max2[N],n;
     
    int main()
    {
        n=read();
        k=read();
        for(int i=1;i<=n;i++)
            a[i].x=read(),a[i].h=read();
        sort(a+1,a+1+n,cmp);
        q1.push_back(a[1]);
        for(int i=2;i<=n;i++) {
            while(!q1.empty() && q1.front().x<a[i].x-k)
                q1.pop_front();
            while(!q1.empty() && q1.back().h<=a[i].h)
                q1.pop_back();
            max1[i]=q1.front().h;
            q1.push_back(a[i]);
        }
        q2.push_back(a[n]);
        for(int i=n-1;i>=1;i--) {
            while(!q2.empty() && q2.front().x>a[i].x+k)
                q2.pop_front();
            while(!q2.empty() && q2.back().h<=a[i].h)
                q2.pop_back();
            max2[i]=q2.front().h;
            q2.push_back(a[i]);
        }
        max1[1]=max2[n]=0;
        for(int i=1;i<=n;i++)
            if(max1[i]>=a[i].h*2&&max2[i]>=a[i].h*2)
                ans++;
        cout<<ans;
        return 0;
    }

    后记 

    第二题是我们学校模拟赛的题,但当时居然忘了滑动窗口怎么打,耽误了许多时间。说明我对单调队列还不是很熟悉。

    展开全文
  • TableLayout布局的效果就是整齐的表格,看着非常舒心。当遇到数据较多时,可以添加到ScrollView和HorizontalScrollView进行...这就导致看下面的数据时不知道每的数据指的是什么,体验性就比较差。理想的做法就是固

    TableLayout布局的效果就是整齐的表格,看着非常舒心。当遇到数据较多时,可以添加到ScrollView和HorizontalScrollView进行上下和左右的滑动。左右滑动的体验性一般比较合理,但是上下滑动就有些不舒心了。因为常规中,第一行数据是表头,即所谓的列名,在上下滑动的时候标题列也随着滑动而隐藏掉。这就导致看下面的数据时不知道每列的数据指的是什么,体验性就比较差。理想的做法就是固定标题栏,只有数据可以上下滚动,这样,就可以一直看到标题栏了。遗憾的是Android并没有提供直接固定标题栏的方法,那么这就要我们程序猿自己想法实现了。当然,程序猿是一种非常聪明的生物,这群家伙大脑非常活跃,想出了不止一种实现的方法。而我作为其中一支猿,只想出了一种,其他方法还望猿们一块分享。

    首先说下实现思路:和普通的加载数据一样,把数据完整的显示在TableLayout中,创建一个ScrollView,将TableLayout添加其中。这时,上下滚动的时候标题栏会滚动隐藏,这个TableLayout叫做数据Layout。然后再创建一个TableLayout,这个TableLayout只用于显示标题栏,这个叫做标题Layout。再创建一个FramLayout,把数据Layout和标题Layout按照顺序添加到FramLayout中。这时,整个显示并不会左右滑动,因此需要将FramLayout加入到一个HorizontalScrollView中。大概就是这样。

    不过遇到一种情况时需要做下处理:当你的TableRow中每列数据的宽度是WRAP_CONTENT时,这个时候需要设置标题Layout中每个列的宽度与数据Layout中对应列的宽度相同。

    下面贴下伪代码,不能运行、

    ScrollView ssv=new ScrollView(this);                   //竖向滑动
    HorizontalScrollView sv=new HorizontalScrollView(this);//横向滑动
    FrameLayout frameLayout=new FrameLayout(this);         //布局
    Timer timer;
    TimerTask timerTask;
    
    loadData(){                                            
    	TableLayout dataLayout= new TableLayout(this); //显示数据的TableLayout 
    	TableRow dataHead=new TableRow(this);          //显示标题的行
    	init(dataHead);	                               //加载数据给标题
    	dataLayout.addView(dataHead);
    	//显示标题的TableLayout 
    	TableLayout headLayout= new TableLayout(this);                                                       
    	//显示标题的行 
    	TableRow newHead=new TableRow(this);                                                                                                  
    	init(newHead);                                //加载数据给标题
    
    	ssv.addView(dataLayout);                      //使数据Layout能上下滑动
    	frameLayout.addView(ssv);                     //添加数据Layout到FrameLayout中
                                         
    	//覆盖数据Layout中的标题行,注意,headLayout没在ScrollView中,所以不会上下滑动
    	frameLayout.addView(headLayout);              
     	//使整体能够左右滑动	
    	sv.addView(frameLayout);                     
    
    	//加载数据到dataLayout中
    	.....//加载完成
    
    	//由于数据Layout每列的宽度是根据内容调节的,所以在数据Layout加载好后,等待那么一小会儿,给标题Layout设置宽度,与数据Layout宽度对齐
        	timer = new Timer();         
        	startTimerTask();	
    }
    
    init(TableRow row){
    	//加载列名到第一行
    }
    
    	private void startTimerTask() {
            if (timer != null) {
                if (timerTask != null) {
                    timerTask.cancel();
                }
            }
            timerTask = new TimerTask() {
                @Override
                public void run() {
                    Message message = new Message();
                    message.what = 9;
                    handler1.sendMessage(message);
                }
            };
            timer.schedule(timerTask, 300);   //300毫秒后执行
        }
    
        Handler handler1 = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case 9:			
    		//遍历数据Layout标题行的子元素
                        for (int i = 0; i < dataHead.getChildCount(); i++) { 
    			//获取数据Layout标题行中的子元素    
                            Object o = dataHead.getChildAt(i); 
    			//获取标题Layout中标题行的子元素                 
                            Object o2 = newHead.getChildAt(i);                  
                            if (o instanceof TextView) {
                                TextView tv = (TextView) o;
    			 //获取数据Layout标题行中的子元素的宽度  
                                int w = tv.getWidth();                                                                     
    			//设置标题Layout中标题行子元素的宽度
                             ((TextView) o2).setLayoutParams(new TableRow.LayoutParams(w, ViewGroup.LayoutParams.WRAP_CONTENT)); 
    
                            }
                        }
                        if (newHead.getParent() == null) {
                            headLayout.addView(newHead, new TableLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT
                                    , ROW_HEIGHT));
                        }
                        if (timerTask != null) {
                            timerTask.cancel();
                        }
                        break;
                }
            }
        };


    大概思路就是上面所说,可能我叙述的比较不直观,没图没真相,但是如果你想实现这样的效果最好还是耐心看完。











    展开全文
  • 最安全的做法是不要在标题列名称中使用空格,并尽量使它们简短,以便您可以使用它们(但仍要知道它们指的是什么)。 因此,应将名为“干旱年”的列命名为“干旱年”或“干旱年”。 您的源数据可能具有很长的列标题...
  • 标题可能有点长,什么叫“完整基础DOM结构”,这里“基础”意思是指这个结构不依赖具体数据,不依赖Datagridview属性,只要存在Datagrid实例就会存在这样基础DOM结构;而“完整”意思是指在冻结,冻结行...
  • ELEMENT" 是元素的声明,说明你要定义的是一个元素; 声明后面的"DESCRIPTION",是元素的名称; "(#PCDATA, DEFINITION)*>"则是该元素的使用规则。规则定义了元素可以包含的内容以及相互的关系。下面的表格概要...
  • 而“完整”意思是在冻结,冻结行,标题,footer,分页这些功能块都存在时候DOM结构。 要搞清楚Datagrid工作原理,这个DOM结构必须要烂熟于胸,我们直接来看这个“基础完整DOM结构”是什么样子: <...
  • 标题可能有点长,什么叫“完整基础DOM结构”,这里“基础”意思是指这个结构不依赖具体数据,不依赖Datagridview属性,只要存在Datagrid实例就会存在这样基础DOM结构;而“完整”意思是指在冻结,冻结行...
  • 标题可能有点长,什么叫“基础完整DOM结构”,这里“基础”意思是指这个结构不依赖具体数据,不依赖Datagridview属性,只要存在 Datagrid实例就会存在这样基础DOM结构;而“完整”意思是指在冻结,冻结行...
  • 这种方式是指根据容器元素高度以及列表项元素高度来显示长列表数据中某一个部分,而不是去完整地渲染长列表,以提高无限滚动性能。而按需显示方案实现就是本文标题中说虚拟列表。 虚拟列表实现有...
  • 我们这里有个点V,指向V的边就是入度,从V出去的是出度 什么是树?只有一个点入度为0,其它点入度为1的图就是树。 好了,一旦解决了什么是树,那所有问题解决了。什么?你说还不懂?那我给你一个个出来 只有一个...
  • 首先,我详细描述下文章标题里面多条件分页查询细节具体指什么? 多条件分页查询我们常用功能,今天留意到这样一个细节: 一般情况下,我们会将提供给用户选择所有条件在页面上,然后去判断用户选择了哪些...
  • 1、从txt文件导入数据。...“在第一个数据行中显示名称”-点击左侧”-“行分隔符”是指源文件中数据行与行之间什么符号界定。“分隔符”是指列之间如何分隔。-下一步……到“选择
  • 这就是有人指的站点被spidered或crawled.这个spider就会规律性的访问此站点,如每一两个月,来发现是否有变化。 Spider发现的一切都进入到搜索引擎的第二个部分:索引。有时索引叫做目录,像一本包含有spider发现...
  • 推荐系统中i2i、u2i、u2i2i、u2u2i、u2tag2i,都是指推荐系统召回路径。 通过上图理解什么是召回路径: u、i、tag是指图中节点 2是指图中线 i2i:从一个物品到达另外一个物品,item 到 item 应用:...
  • 那么框架的特性到底指的是什么呢?我们举两个例子来感受一下。 <h3>1.1 声明式 & 数据驱动渲染 更深一步思考,React提供的JSX和Vue提供的模板,它们的目的是什么?目的是为了实现声明式...
  • ArcEngine之地图制图说明窗体界面搭建MapControl与PageLayoutControl...对于插入制图要素部分,代码实现固定类型制图要素(除文字标题外)和固定位置**,你也可以丰富其功能,使制图要素能够在SymbolCon
  • 想问一下这张图下面需要获取数据配适器且倒数第三行dr[1]中1代表什么是指第一行意思吗?序号是否与索引不同,非从0开始表示 ,这张图又不需要获取数据适配器,这个数据适配器是不是可写可不写 ...
  • LINGO软件学习

    2009-08-08 22:36:50
    在主窗口内的标题为LINGO Model – LINGO1窗口LINGO默认模型窗口,建立模型都都要在该窗口内编码实现。下面举两个例子。 例1.1 如何在LINGO中求解如下LP问题: 在模型窗口中输入如下代码: min=2*x1+3*...
  • 本篇作为复习javaweb慢慢长路上一小站,只是简单对...该语言用来描述网页,通过HTML可以构建一套标记符号和语法规则,将所要现实文字、图象和声音等要素按照一定标准要求排放,形成一定的标题、段落和...
  • 如何用java实现水仙花数

    万次阅读 多人点赞 2020-10-25 22:40:23
    看到标题,首先先要知道什么是水仙花数。 所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数 如153=1*1*1+5*5*5+3*3*3 那么153就是水仙花数,首先分析需要功能,首先他一个3位数。 那值一定在...

空空如也

空空如也

1 2 3 4
收藏数 78
精华内容 31
关键字:

列标题指的是什么