精华内容
下载资源
问答
  • 我们还用经验重子塔利·费舍(Tully Fisher)关系检验了理论结果,该关系表明星系的旋转速度与其质量之间存在线性关系。 数学计算可预测我们的理论结果与一组12个旋涡星系的实验观测值之间的良好对应关系。
  • 从内部控制实施的角度出发,探讨信息技术能力对内部控制作用,认为信息技术能力从制度层面、流程层面以及信息层面对内部控制产生了积极的效果,同时构建了信息技术能力对内部控制作用的研究框架,以期为以后的研究提供...
  • 为了研究层间滑移隔震结构的隔震效果,从理论上建立了层间滑移隔震结构的力学模型和静动转化条件。使用SAP2000有限元软件对框架结构进行抗震及隔震结构的模拟。对比分析其在孝中、大震作用下的减震效果,结果表明层间...
  • 基本延迟 一个非常基本的延迟,基于juce框架,并在“音频效果-理论,隐喻和应用”一书的帮助下完成。
  • 元认知是人们对自身认知活动的自我意识、自我监控与自我调节,元认知理论在学习实践中具有广泛的适应性。大学英语教学中运用元认知策略改革教学与测试模式,能提高学生的自主学习能力,取得良好的教学效果
  • 网页中的框架

    千次阅读 热门讨论 2014-06-29 11:32:45
    Html中的框架,学习完今天这节,基本的Html的理论知识就告一段落了。  什么是Html框架?   将浏览器窗口,划分为不同的区域,每个区域可以包含不同的网页。以实现,多个网页在一个浏览器窗口中现实的效果。 ...
    

     

     Html中的框架,学习完今天这节,基本的Html的理论知识就告一段落了。


      什么是Html框架?


     将浏览器窗口,划分为不同的区域,每个区域可以包含不同的网页。以实现,多个网页在一个浏览器窗口中现实的效果。

     

    小结:说白了,就是起到一个整合作用,把其他网页的内容直接嵌套过来利用。



     

      Html框架语法

    • <frameset rows=”控制行数及行高” cols=”控制列数及列宽 framespacing=”框架间距” frameborder=”是否显示框架(yes/no/1/0)” border=”边框宽度” bordercolor=”边框颜色”>

    • <frame src=”被包含的文件路径及名称” name=”框架名称” noresize=”是否允许改变框架尺寸”(true/false) scrolling=”滚动条显示控制”(yes/no/auto)>

    • </frameset>

     

     

    牛刀小试

     像往常一样,试一下,熟悉下代码环境即可,无须记住。

     

    效果图如下:

     

    如图所示,这是由两个网页嵌套的效果,左边是一个,右边也是一个,这就是所谓的网页的框架。

     

    左边

    <span style="font-size:18px;"><html>
     <head>
    <title>左侧</title>      <!--网页标题-->
    <body>
    <table border="1" width="200">
    <caption>仿126邮箱管理</caption>       <!--标题-->
    <tr>
    <td>添加邮件</td>     <!--第一行第一列-->
    </tr>
    <tr>
    <td>删除邮件</td>      <!--第一行第二列-->
    </tr>
    <tr>
    <td>收邮件</td>
    </tr>
    <tr>
    <td>写邮件</td>
    </tr>
    </table>
    </body>
    </head>
    </html></span>

    右边

    <span style="font-size:18px;"><html>
     <head>
    <title>左侧</title>      <!--网页标题-->
    <body>
    <table border="1" width="500" cellpadding="10">    <!--添加一个表格-->
    <caption>这里是添加邮件的页面</caption>         
    <tr>
    <td colspan=="2">在这里写邮件</td>           <!---第一行合并->
    </tr>
    <tr>
    <td>邮件标题</td>
    <td><input type="text" name="email" size="40"></td>
    </tr>
    <tr>
    <td>邮件内容</td>
    <td>
    <textarea cols="40" rows="10" name="neirong">      <!--添加多行文本框-->
    </textarea>
    </td>
    </tr>
    </table>
    </body>
    </head>
    </html></span>

    嵌套整合

     

    <span style="font-size:18px;"><html>
     <head>
    <title>嵌套整合</title>      <!--网页标题-->
    <frameset cols="300,600" bordercolor="black" border="5" frameborder="10" >  <!--设置为两列-->
    <frame src="left.htm" scrolling="true">     <!--整合左边网页-->
    <frame src="right.htm">                 <!--整合右边网页-->
    </frameset>
    </head>
    </html></span>



    小结

    这段时间学习了html,也算不上什么高打上的技术,自从学习完VB后,再也不用担心我的学习了,学什么都感觉不到太吃力,这估计来自于平时的善于总结,善于寻找共同点,能够把复杂问题简单化。技术没什么好学习的,只有你知道不知道的技术,没有你学不会的技术,但学习的方法和理念这没有速成的办法,只有靠平时的点滴积累来逐渐的培养。

    展开全文
  • ORM框架

    2017-02-23 09:25:14
    ORM 对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序...面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来
    
    

    ORM

    对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转 。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。
    面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。
    对象关系映射(Object-Relational Mapping)提供了概念性的、易于理解的模型化数据的方法。ORM方法论基于三个核心原则: 简单:以最基本的形式建模数据。 传达性:数据库结构被任何人都能理解的语言文档化。 精确性:基于数据模型创建正确标准化的结构。 典型地,建模者通过收集来自那些熟悉应用程序但不熟练的数据建模者的人的信息开发信息模型。建模者必须能够用非技术企业专家可以理解的术语在概念层次上与数据结构进行通讯。建模者也必须能以简单的单元分析信息,对样本数据进行处理。ORM专门被设计为改进这种联系。
    简单的说:ORM相当于中继数据。具体到产品上,例如ADO.NET Entity Framework。DLINQ中实体类的属性[Table]就算是一种中继数据。

    摘自 李刚 著《Java EE企业级应用实战》 

    目前ORM框架的产品非常之多,除了个大公司、组织的产品外,其他一些小团队也在推出自己的ORM框架。目前流行的ORM框架有如下这些产品:

    (1)Enitiy EJB:Enitiy EJB实际上也是一种ORM技术,这是一直备受争议的组件技术。事实上,EJB为Java EE的蓬勃发展赢得了极高的声誉,EJB作为一种重量级、高花费的ORM技术具有不可比拟的优势。就其他架构设计来讲,依然非常优秀。即使现在十分流行的轻量级Java EE架构,其实质是对经典Java EE架构的模仿——虽然存在些许的改进。EJB3.1也采取了低侵入式的设计,增加了Annotation,也具有极大的吸引力。

    (2)hibernate:目前最流行的开源ORM框架,已经被选作JBoss的持久层解决方案。整个HIbernate项目也一并投入了Jboss的怀抱,而JBoss又加入了RedHat组织,所以现在Hibernate属于RedHat 的一部分。Hibernate 灵巧的设计、优秀的性能,还有其丰富的文档都是其风靡全球的重要因素。

    (3)iBatis: Apache软件基金组织的子项目。与其称它为一种ORM框架,不如称它为一中“SQL Mapping”框架。曾经在J2EE的开发中扮演非常重要的角色,但因为不支持存粹的面向对象操作,因此现在逐渐地被取代。但是在一些公司,依然占有一席之地,特别是一些对数据访问特别灵活的地方,iBatis更加的灵活,它允许开发人员直接编写SQL语句。

    (4)TopLinkOracle公司的产品,作为一个遵循OTN协议的商业产品,TopLink 在开发过程中可以自由地下载和使用,但是一旦作为商业产品被使用,则需要收取费用。由于这一点,TopLink 的市场占有率不高。

    (5)OBJ:Apache软件基金组织的子项目。另一个开源的ORM框架,可以说是Apache作为iBatis之后的取代产品,也是非常优秀的O/R Mapping框架,但是由于Hibernate 的广芒太盛,所以并未有广泛的使用,而且由于OJB的开发文档不是很多,这也影响了OJB的流行。


    我的开发框架之ORM框架


    首先说说我对现在主流的ORM框架的一些看法:

    优点:

    1. 让程序员不再关注数据库细节,专心在业务逻辑上,程序员可以不懂数据库就可以开发系统。
    2. 让数据库迁移变的非常方便,如果系统需要更改使用的数据库,直接改配制就好了,不要再管不同数据库之间的语法差异。
    3. 省时,可快速开发,因为不需要自己写复杂的SQL语句,不需要封装复杂的数据底层,这样可以节省很多时间。

    缺点:

    1. 我觉得不懂数据库的程序员不是好程序员,ORM不能帮你生成所有的业务语句,有些复杂的生成不了,还是需要写SQL,例如复杂的报表。
    2. 配制过于繁琐,出错后不好定位问题点在哪。
    3. 性能低,因为它内部是使用了大量反射,还有数据库检测,造成性能必然低下。
    4. 需要额外的学习成本,虽然不需要学习数据库,但是需要学习ORM语句。


    展开全文
  • 框架梁柱连接节点设计是否合理直接影响结构的整体受力和安全性,...文章论述了钢框架梁柱连接节点的形式及其设计,并将其理论与技术应用到工程实际中,取得了良好的技术经济效果,也总结了钢框架梁柱连接节点的设计体会。
  • Java持久层框架

    2020-05-28 22:19:46
    一、常用的ORM框架 ORM:对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 。从效果上说,它其实是创建...

    一、ORM框架

         ORM:对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 。从效果上说,它其实是创建了一个可在编程语言里使用的--"虚拟对象数据库"。面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。

         对象关系映射(ORM)是一种功能,用于通过将对象状态映射到数据库列来开发和维护对象和关系数据库之间的关系。 它能够轻松处理(或执行)各种数据库操作,如插入,更新,删除等。

    映射方向

    单向关系 - 在这种关系中,只有一个实体可以将属性引用到另一个实体。它仅包含一个侧面,由于指定如何更新可以在数据库中进行。

    双向关系 - 这种关系包含两边 - 既包含一个侧面,也包含另一个侧面。 所以这里每个实体都有一个关系字段或将该属性引用到其他实体。

    映射类型

    一对一 - 此关联由@OneToOne注释表示。在这里,每个实体的实例与另一个实体的单个实例相关。

    一对多 - 此关联由@OneToMany注释表示。 在这种关系中,一个实体的实例可以与另一个实体的多个实例相关联。

    多对一 - 此映射由@ManyToOne注释定义。 在这种关系中,一个实体的多个实例可以与另一个实体的单个实例相关联。

    多对多 - 此关联由@ManyToMany注释表示。 在这种关系中,一个实体的多个实例可能与另一个实体的多个实例有关。 在这个映射中,任何一方都可以成为所有者方。

    二、Mybatis

    什么是 MyBatis?

        MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

    使用mybatis

      (1)引入jar包

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>x.x.x</version>
    </dependency>

     (2)从 XML 中构建 SqlSessionFactory

          每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。

    String resource = "org/mybatis/example/mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
      PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
      <environments default="development">
        <environment id="development">
          <transactionManager type="JDBC"/>
          <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
          </dataSource>
        </environment>
      </environments>
      <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
      </mappers>
    </configuration>

    (3)从 SqlSessionFactory 中获取 SqlSession

    try (SqlSession session = sqlSessionFactory.openSession()) {
      BlogMapper mapper = session.getMapper(BlogMapper.class);
      Blog blog = mapper.selectBlog(101);
    }

    (4)探究已映射的 SQL 语句  xml方式

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="org.mybatis.example.BlogMapper">
      <select id="selectBlog" resultType="Blog">
        select * from Blog where id = #{id}
      </select>
    </mapper>

    (5)通过java注解方式

    package org.mybatis.example;
    public interface BlogMapper {
      @Select("SELECT * FROM blog WHERE id = #{id}")
      Blog selectBlog(int id);
    }

    使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。

    (6)MyBatis 动态SQL

      动态 SQL:MyBatis 的强大特性之一便是它的动态 SQL。

    <select id="findActiveBlogLike"
         resultType="Blog">
      SELECT * FROM BLOG 
      <where> 
        <if test="state != null">
             state = #{state}
        </if> 
        <if test="title != null">
            AND title like #{title}
        </if>
        <if test="author != null and author.name != null">
            AND author_name like #{author.name}
        </if>
      </where>
    </select>

    三、Spring Data JPA

    什么是Spring data jpa ?

      Spring data jpa 是较大的 spring家族的一部分,它使得很容易实现基于 jpa 的存储库。

      Spring Data JPA 进行持久层(即Dao)开发一般分三个步骤:

    (1)声明持久层的接口,该接口继承 Repository(或Repository的子接口,其中定义了一些常用的增删改查,以及分页相关的方法)。

    (2)在接口中声明需要的业务方法。Spring Data 将根据给定的策略生成实现代码。

    (3)在 Spring 配置文件中增加一行声明,让 Spring 为声明的接口创建代理对象。配置了 <jpa:repositories> 后,Spring 初始化容器时将会扫描 base-package 指定的包目录及其子目录,为继承 Repository 或其子接口的接口创建代理对象,并将代理对象注册为 Spring Bean,业务层便可以通过 Spring 自动封装的特性来直接使用该对象。

    (1)整合springboot,引入jar包

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.6</version>
    </dependency>

    (2)项目配置

    #通用数据源配置
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://10.110.2.56:3306/springboot_jpa?charset=utf8mb4&useSSL=false
    spring.datasource.username=springboot
    spring.datasource.password=springboot
    # Hikari 数据源专用配置
    spring.datasource.hikari.maximum-pool-size=20
    spring.datasource.hikari.minimum-idle=5
    # JPA 相关配置
    spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
    spring.jpa.show-sql=true
    spring.jpa.hibernate.ddl-auto=create

    (3)实体类

    @Entity
    @Table(name = "AUTH_USER")
    public class UserDO {
        @Id
        private Long id;
        @Column(length = 32)
        private String name;
        @Column(length = 32)
        private String account;
        @Column(length = 64)
        private String pwd;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAccount() {
            return account;
        }
    
        public void setAccount(String account) {
            this.account = account;
        }
    
        public String getPwd() {
            return pwd;
        }
    
        public void setPwd(String pwd) {
            this.pwd = pwd;
        }
    }

    (4)持久层服务,实现JpaRepository可以包含很多可用的方法,比如分页,内置的各类查找,无需再编写代码实现。

    @Repository
    public interface UserDao extends JpaRepository<UserDO, Long> {
    }

     

     

    展开全文
  • 为保障固体充填开采岩层移动控制效果,采用理论、实验和工程实践相结合的研究方法,在系统的分析了综合机械化固体充填质量影响因素和岩层移动控制机理基础上,从岩层移动控制理论、充填质量设计、充填质量控制和充填...
  • 最张没办法,终于忍不了了,自己就写了一个下拉刷新的框架,这个框架是一个通用的框架效果和设计感觉都还不错,现在分享给各位看官。 一. 关于下拉刷新 下拉刷新这种用户交互最早由twitter创始人洛伦•布里切特...
  • 工程岩石爆破理论假说,王甲见,,目前工程岩石爆破施工设计时,主要参数确定缺乏理论框架;爆破效果的分析没有主导理论和方法;主要参数孔径、药经、孔间距等的确
  • 机械结构和电路系统复杂的传感器原理的理论教学内容枯燥、抽象,学生...研制了电动式框架式转子陀螺仪教具,在此教具上可进行陀螺仪定轴性、进动性和陀螺力矩的定性演示和定量计算实验,能有效提高陀螺仪特性的教学效果
  • 最张没办法,终于忍不了了,自己就写了一个下拉刷新的框架,这个框架是一个通用的框架效果和设计感觉都还不错,现在分享给各位看官。 1,关于下拉刷新 下拉刷新这种用户交互最早由twitter创始人洛伦•...

    前段时间项目中用到了下拉刷新功能,之前在网上也找到过类似的demo,但这些demo的质量参差不齐,用户体验也不好,接口设计也不行。最张没办法,终于忍不了了,自己就写了一个下拉刷新的框架,这个框架是一个通用的框架,效果和设计感觉都还不错,现在分享给各位看官。

    1,关于下拉刷新

    下拉刷新这种用户交互最早由twitter创始人洛伦•布里切特(Loren Brichter)发明, 有理论认为,下拉刷新是一种适用于按照从新到旧的时间顺序排列feeds的应用 ,在这种应用场景中看完旧的内容时,用户会很自然地下拉查找更新的内容,因此下拉刷新就显得非常合理。大家可以参考这篇文章: 有趣的下拉刷新 ,下面我贴出一个有趣的下拉刷新的案例。

     

    图一、有趣的下拉刷新案例(一)

     

    图一、有趣的下拉刷新案例(二) 

    2,实现原理

    上面这些例子,外观做得再好看,他的本质上都一样,那就是一个下拉刷新控件通常由以下几部分组成:

    【1】Header

    Header通常有下拉箭头,文字,进度条等元素,根据下拉的距离来改变它的状态,从而显示不同的样式

    【2】Content

    这部分是内容区域,网上有很多例子都是直接在ListView里面添加Header,但这就有局限性,因为好多情况下并不一定是用ListView来显示数据。我们把要显示内容的View放置在我们的一个容器中,如果你想实现一个用ListView显示数据的下拉刷新,你需要创建一个ListView旋转到我的容器中。我们处理这个容器的事件(down, move, up),如果向下拉,则把整个布局向下滑动,从而把header显示出来。

    【3】Footer

    Footer可以用来显示向上拉的箭头,自动加载更多的进度条等。

    以上三部分总结的说来,就是如下图所示的这种布局结构:

    图三,下拉刷新的布局结构

    关于上图,需要说明几点:

    1、这个布局扩展于 LinearLayout ,垂直排列

    2、从上到下的顺序是:Header, Content, Footer

    3、Content填充满父控件,通过设置top, bottom的padding来使Header和Footer不可见,也就是让它超出屏幕外

    4、下拉时,调用scrollTo方法来将整个布局向下滑动,从而把Header显示出来,上拉正好与下拉相反。

    5、派生类需要实现的是:将Content View填充到父容器中,比如,如果你要使用的话,那么你需要把ListView, ScrollView, WebView等添加到容器中。

    6、上图中的红色区域就是屏的大小(严格来说,这里说屏幕大小并不准确,应该说成内容区域更加准确)

    3,具体实现

    明白了实现原理与过程,我们尝试来具体实现,首先,为了以后更好地扩展,设计更加合理,我们把下拉刷新的功能抽象成一个接口:

    1、IPullToRefresh<T extends View>

    它具体的定义方法如下:

    public interface IPullToRefresh<T extends View> {
        public void setPullRefreshEnabled(boolean pullRefreshEnabled);
        public void setPullLoadEnabled(boolean pullLoadEnabled);
        public void setScrollLoadEnabled(boolean scrollLoadEnabled);
        public boolean isPullRefreshEnabled();
        public boolean isPullLoadEnabled();
        public boolean isScrollLoadEnabled();
        public void setOnRefreshListener(OnRefreshListener<T> refreshListener);
        public void onPullDownRefreshComplete();
        public void onPullUpRefreshComplete();
        public T getRefreshableView();
        public LoadingLayout getHeaderLoadingLayout();
        public LoadingLayout getFooterLoadingLayout();
        public void setLastUpdatedLabel(CharSequence label);
    }
    这个接口是一个泛型的,它接受View的派生类, 因为要放到我们的容器中的不就是一个View吗?

    2、PullToRefreshBase<T extends View>

    这个类实现了IPullToRefresh接口,它是从LinearLayout继承过来,作为下拉刷新的一个 抽象 基类,如果你想实现ListView的下拉刷新,只需要扩展这个类,实现一些必要的方法就可以了。这个类的职责主要有以下几点:

    • 处理onInterceptTouchEvent()和onTouchEvent()中的事件 : 当内容的View(比如ListView)正如处于最顶部,此时再向下拉,我们必须截断事件,然后move事件就会把后续的事件传递到onTouchEvent()方法中,然后再在这个方法中,我们根据move的距离再进行scroll整个View。
    • 负责创建Header、Footer和Content View : 在构造方法中调用方法去创建这三个部分的View,派生类可以重写这些方法,以提供不同式样的Header和Footer,它会调用createHeaderLoadingLayout和createFooterLoadingLayout方法来创建Header和Footer创建Content View的方法是一个抽象方法,必须让派生类来实现,返回一个非null的View,然后容器再把这个View添加到自己里面。
    • 设置各种状态: 这里面有很多状态,如下拉、上拉、刷新、加载中、释放等,它会根据用户拉动的距离来更改状态,状态的改变,它也会把Header和Footer的状态改变,然后Header和Footer会根据状态去显示相应的界面式样。

    3、PullToRefreshBase<T extends View>继承关系

    这里我实现了三个下拉刷新的派生类,分别是ListView、ScrollView、WebView三个,它们的继承关系如下:

     

    图四、PullToRefreshBase类的继承关系

    关于PullToRefreshBase类及其派和类,有几点需要说明:

    • 对于ListView,ScrollView,WebView这三种情况,他们是否滑动到最顶部或是最底部的实现是不一样的,所以,在PullToRefreshBase类中需要调用两个抽象方法来判断当前的位置是否在顶部或底部,而其派生类必须要实现这两个方法。比如对于ListView,它滑动到最顶部的条件就是第一个child完全可见并且first postion是0。这两个抽象方法是:
    /**
         * 判断刷新的View是否滑动到顶部
         * 
         * @return true表示已经滑动到顶部,否则false
         */
        protected abstract boolean isReadyForPullDown();
        
        /**
         * 判断刷新的View是否滑动到底
         * 
         * @return true表示已经滑动到底部,否则false
         */
        protected abstract boolean isReadyForPullUp();
    • 创建可下拉刷新的View(也就是content view)的抽象方法是
    /**
         * 创建可以刷新的View
         * 
         * @param context context
         * @param attrs 属性
         * @return View
         */
        protected abstract T createRefreshableView(Context context, AttributeSet attrs);
    4、LoadingLayout

    LoadingLayout是刷新Layout的一个抽象,它是一个抽象基类。Header和Footer都扩展于这个类。这类抽象类,提供了两个抽象类:

    • getContentSize
    这个方法返回当前这个刷新Layout的大小,通常返回的是布局的高度,为了以后可以扩展为水平拉动,所以方法名字没有取成getLayoutHeight()之类的,这个返回值,将会作为松手后是否可以刷新的临界值,如果下拉的偏移值大于这个值,就认为可以刷新,否则不刷新,这个方法必须由派生类来实现。
    • setState

    这个方法用来设置当前刷新Layout的状态,PullToRefreshBase类会调用这个方法,当进入下拉,松手等动作时,都会调用这个方法,派生类里面只需要根据这些状态实现不同的界面显示,如下拉状态时,就显示出箭头,刷新状态时,就显示loading的图标。

    可能的状态值有: RESET, PULL_TO_REFRESH, RELEASE_TO_REFRESH, REFRESHING, NO_MORE_DATA


    LoadingLayout及其派生类的继承关系如下图所示: 

     

    图五、LoadingLayout及其派生类的类图

    我们可以随意地制定自己的Header和Footer,我们也可以实现如图一和图二中显示的各种下拉刷新案例中的Header和Footer,只要重写上述两个方法getContentSize()和setState()就行了。HeaderLoadingLayout,它默认是显示箭头式样的布局,而RotateLoadingLayout则是显示一个旋转图标的式样。

    5、事件处理

    我们必须重写PullToRefreshBase类的两个事件相关的方法onInterceptTouchEvent()和onTouchEvent() 方法。由于ListView,ScrollView,WebView它们是放到PullToRefreshBase内部的,所在事件先是传递到PullToRefreshBase#onInterceptTouchEvent()方法中,所以我们应该在这个方法中去处理ACTION_MOVE事件,判断如果当前ListView,ScrollView,WebView是否在最顶部或最底部,如果是,则开始截断事件,一旦事件被截断,后续的事件就会传递到PullToRefreshBase#onInterceptTouchEvent()方法中,我们再在ACTION_MOVE事件中去移动整个布局,从而实现下拉或上拉动作。

    6、滚动布局(scrollTo)

    如图三的布局结构可知,默认情况下Header和Footer是放置在Content View的最上面和最下面,通过设置padding来让他跑到屏幕外面去了,如果我们将整个布局向下滚动(scrollTo)一定距离,那么Header就会被显示出来,基于这种情况,所以在我的实现中,最终我是调用 scrollTo 来实现下拉动作的。

    总的说来,实现的重要的点就这些,具体的一些细节在实现在会碰到很多,可以参考代码。

    5、如何使用

    使用下拉刷新的代码如下

    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
            mPullListView = new PullToRefreshListView(this);
            setContentView(mPullListView);
            
            // 上拉加载不可用
            mPullListView.setPullLoadEnabled(false);
            // 滚动到底自动加载可用
            mPullListView.setScrollLoadEnabled(true);
            
            mCurIndex = mLoadDataCount;
            mListItems = new LinkedList<String>();
            mListItems.addAll(Arrays.asList(mStrings).subList(0, mCurIndex));
            mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mListItems);
            
            // 得到实际的ListView
            mListView = mPullListView.getRefreshableView();
            // 绑定数据
            mListView.setAdapter(mAdapter);       
            // 设置下拉刷新的listener
            mPullListView.setOnRefreshListener(new OnRefreshListener<ListView>() {
                @Override
                public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
                    mIsStart = true;
                    new GetDataTask().execute();
                }
    
                @Override
                public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
                    mIsStart = false;
                    new GetDataTask().execute();
                }
            });
            setLastUpdateTime();
            
            // 自动刷新
            mPullListView.doPullRefreshing(true, 500);
        }
    这是初始化一个下拉刷新的布局,并且调用setContentView来设置到Activity中。

    在下拉刷新完成后,我们可以调用 onPullDownRefreshComplete()和onPullUpRefreshComplete() 方法来停止刷新和加载

    6、运行效果

    这里列出了demo的运行效果图。

     

    图六、ListView下拉刷新,注意Header和Footer的样式

     

    图七、WebView和ScrollView的下拉刷新效果图

    7、源码下载

    实现这个下拉刷新的框架,并不是我的原创,我也是参考了很多开源的,把我认为比较好的东西借鉴过来,从而形成我的东西,我主要是参考了下面这个demo:

    https://github.com/chrisbanes/Android-PullToRefresh  这个demo写得不错,不过他这个太复杂了,我们都知道,一旦复杂了,万一我们要添加一些需要,自然也要费劲一些,我其实就是把他的简化再简化,以满足我们自己的需要。

    展开全文
  • 最张没办法,终于忍不了了,自己就写了一个下拉刷新的框架,这个框架是一个通用的框架效果和设计感觉都还不错,现在分享给各位看官。  1,关于下拉刷新  下拉刷新这种用户交互最早由twitter创始人洛伦•...
  • 算法理论介绍1.最近邻插值算法原理计算公式效果展示图2.双线性插值算法原理计算公式效果展示图3.映射方法向前映射法向后映射法三.基于opencv的python实现总结 一.简介 在图像处理中,平移变换、旋转变换以及放缩变换...
  • Spring.net框架

    2011-06-11 14:32:10
    既然类之间的依赖导致耦合过于紧密,按照《设计模式》的理论,我们要依赖于接口。但是人们往往发现,仅仅依赖于接口似乎并不能完全解决问题。我们从上面的例子中抽象出接口后,组件间的依赖关系可能变成如下图所示:...
  • 算法理论介绍1.最近邻插值算法原理计算公式效果展示图2.双线性插值算法原理计算公式效果展示图3.映射方法向前映射法向后映射法三.基于opencv的python实现总结 一.简介 在图像处理中,平移变换、旋转变换以及放缩变换...
  • 我们内部使用的Ui效果展示应用,为了在使用上能够更加便捷快速的集成一个个单独的Ui效果包,我们采用了动态化实现的思路,将Ui效果包放在asserts目录下,我们的主框架动态扫描并加载了整个apk来运行,理论上整个过程...
  • 此存储库是软件框架的源代码,由我本人和供参加2017年7月在加利福尼亚州圣地亚哥举行的Robosub竞赛的NACIT团队编写。... 调试之后,我认为此框架已经具有我之前想象的效果,因此我希望该框架将对我团队的
  • 在基于Loop细分小波紧框架多分辨率分析理论的基础上,推导了Loop细分小波紧框架的分解和重构公式,用这些公式实现了多分辨率曲面的构造并将其应用到三维网格图形的压缩中.通过与双正交Loop细分小波算法的比较,表明基于...
  • 为提升雷达装备教学质量,以“面向任务、基于能力、...该一体化框架对于指导雷达装备教员准确把握教学进程、提升教学效率和效果具有一定价值,为其他以培养应用型人才为目的的大型电子装备教学提供了一定的参考.
  • 测试工作细致繁杂,如何...同时依托该框架设计并实现了相应的关键测试构件之后,利用相应测试构件,在IPv6环境下针对OpenFlow协议进行了一致性测试,发现了OpenFlow协议实现对IPv6支持的一些实现错误,达到了预期效果
  • 数字化转型过程中的企业也迫切需要从优秀实践和过往成败案例中学习理念方法,并提炼出框架理论,以减少数字化转型中遇到的潜在风险和障碍。企业IT管理层和专家们较普遍地认为,企业数字化转型需要自上而下进行,通过...
  • 框架结构为研究对象,在设计出作动器的前提下,对结构设计参数进行摄动,以控制效果为优化目标来确定最优设计参数。在模型降阶方面,选择了基于系统内平衡理论的降阶方法。考虑到磁流变阻尼器的非线性特点及结构...
  • 基于对某框架结构的已有研究,建立有限元数值模型,对其自振频率、振型进行计算,并通过与已有试验数据分析,验证了数值模型的准确性;然后,系统选取了相关的9个参数,对其在损伤识别过程中的特征进行了归类、分析...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 563
精华内容 225
关键字:

框架效果理论