Android编程使用LinearLayout和PullRefreshView实现上下翻页功能的方法
作者:fancylovejava 发布时间:2023-06-30 02:16:15
本文实例讲述了Android编程使用LinearLayout和PullRefreshView实现上下翻页功能的方法。分享给大家供大家参考,具体如下:
前看过网易云阅读客户端,里面的文章可以实现上下拉动实现上下翻页的效果,感觉体验效果很不错。
公司新版本项目的开发中也要求实现类似的效果,不过还好项目需求里面可以提前知道需要实现上下拉动翻页的总的页数。如果像网易那种不提前知道总的页数感觉控制好LinearLayout里面的childView应该也可以达到效果。
好记性不如烂笔头,先写下我提前知道总页数实现上下拉翻页的问题吧!
首先布局仅仅是一个简单的LinearLayout包裹着
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/fenleiPullContentLayout"
android:orientation="vertical">
</LinearLayout>
然后通过一个for循环把PullRefreshView包裹进来
pullContentLayout.removeAllViews();
pullViews.clear();
for(int i=0;i<leftEntityData.size();i++){
PullToRefreshProView pullview = (PullToRefreshProView) inflater.inflate(R.layout.fenleipro_item, null);
LayoutParams param = new LayoutParams(LayoutParams.MATCH_PARENT, scrollHeight);
pullview.setLayoutParams(param);
LinearLayout pullayout = (LinearLayout) pullview.findViewById(R.id.fenleirightlayout);
RightAdapter adapter = new RightAdapter(rightEntityList.get(i));
pullayout.removeAllViews();
for(int k=0;k<adapter.getCount();k++){
View view = adapter.getView(k, null, null);
pullayout.addView(view,k);
}
pullViews.add(pullview);
pullContentLayout.addView(pullview, i);
if(i==0){
pullview.setHeaderRefresh(false);
pullview.setOnFooterRefreshListener(new MyOnRefreshListener(i));
}else if(i==leftEntityData.size()-1){
pullview.setFooterRefresh(false);
pullview.setOnHeaderRefreshListener(new MyOnRefreshListener(i));
}else{
pullview.setOnHeaderRefreshListener(new MyOnRefreshListener(i));
pullview.setOnFooterRefreshListener(new MyOnRefreshListener(i));
}
}
代码说明下:这里的PullToRefreshProView就是一个开源的下拉刷新控件,继承的是一个LinearLayout实现的。网上有源码;然后RightAdapter是一个BaseAdapter,通过这个adapter的getview得到每个view,然后把view添加到inflater出的PullToRefreshProView的子Linearlayoyut里面。然后给每个PullToRefreshProView设置上啦下拉的回调接口,第一个没有上啦,最后个没下拉。这里的MyOnRefreshListener是自己定义的下拉接口
private class MyOnRefreshListener implements OnHeaderRefreshListener,OnFooterRefreshListener{
@Override
public void onFooterRefresh(PullToRefreshProView view) {
}
@Override
public void onHeaderRefresh(PullToRefreshProView view) {
}
}
然后再onFooter和onHeader里面写下拉上拉逻辑。
这里关键是在动画效果交互的实现。
上代码,上拉的动画
public class PullToRefreshUpAnimation extends Animation{
private View view1,view2;
private int delt;
private int topMarginView1 = 0;
public PullToRefreshUpAnimation(Context context,View v1,View v2,int from,int to){
super();
view1 = v1;
view2 = v2;
delt = to - from;
topMarginView1 = view1.getMeasuredHeight();
setDuration(450);
setFillAfter(true);
setInterpolator(new DecelerateInterpolator());
}
public PullToRefreshUpAnimation(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
setDuration(450);
setFillAfter(true);
setInterpolator(new DecelerateInterpolator());
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
android.widget.LinearLayout.LayoutParams param = (android.widget.LinearLayout.LayoutParams)view2.getLayoutParams();
param.topMargin = (int) (interpolatedTime*delt);
param.height = Math.abs(delt);
android.widget.LinearLayout.LayoutParams param1 = (android.widget.LinearLayout.LayoutParams) view1.getLayoutParams();
param1.topMargin = (int) (topMarginView1*(interpolatedTime-1));
param1.height = topMarginView1;
view1.setLayoutParams(param1);
view2.setLayoutParams(param);
}
@Override
public boolean willChangeBounds() {
// TODO Auto-generated method stub
return true;
}
}
下拉动画
public class PullToRefreshAnimation extends Animation{
private View view;
private int delt;
public PullToRefreshAnimation(Context context,View v,int from,int to){
super();
view = v;
delt = to - from;
setDuration(450);
setFillAfter(true);
setInterpolator(new DecelerateInterpolator());
}
public PullToRefreshAnimation(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
setDuration(450);
setFillAfter(true);
setInterpolator(new DecelerateInterpolator());
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
android.widget.LinearLayout.LayoutParams param = (android.widget.LinearLayout.LayoutParams)view.getLayoutParams();
param.topMargin = (int) (interpolatedTime*delt);
param.height = Math.abs(delt);
param.width = android.widget.LinearLayout.LayoutParams.MATCH_PARENT;
view.setLayoutParams(param);
}
@Override
public boolean willChangeBounds() {
// TODO Auto-generated method stub
return true;
}
}
这两个动画的后果是导致最后最外层的LinearLayout包裹的每个子LinearLayout改变了自己的height和topMargin,
所以需要给这个动画设置animationListener,然后每次需要上啦下拉动画前把LinearLayout的height和topMargin重新设置过来,具体怎么实现看具体情况。
PS:这里的核心实现方式其实就是控制好Linearlayout子LinearLayout的height和topMargin
希望本文所述对大家Android程序设计有所帮助。
来源:http://blog.csdn.net/fancylovejava/article/details/42497295


猜你喜欢
- 初始化项目打开IntelliJ IDEA,我的版本是Version 2018.1.4。点击Create New Project。在左侧的列表
- 开发环境win10Android Studio效果用于多级菜单展示,或选择。如 每个省,市,县;如 树木的病虫害;关键代码 @overrid
- LeetCode54. 螺旋矩阵 java实现题目难度 中给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,
- 一、ArrayListArrayList是一个可以处理变长数组的类型,这里不局限于“数”组,ArrayList是一个泛型类,可以存放任意类型
- 利用redis进行springSession的存储:存储:// 在session中保存用户信息 H
- 本文实例为大家分享了java连接SQL Server数据库的具体代码,供大家参考,具体内容如下操作系统:windows 10 64位java
- Java数组的定义和使用如果希望保存一组有相同类型的数据,可以使用数组。数组的定义和内存分配Java 中定义数组的语法有两种:
- 一、概述针对八种基本数据类型定义相应的引用类型—包装类(封装类)。二、作用有了类的特点,就可以调用类中的方法,Java才
- 在程序开发过程中,如何会使用键盘来完成所有的操作,会提高开发的速度。所以说,灵活的掌握并应用visual studio 的键盘快捷键非常重要
- Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(
- 作为Android开发者,工作中少不了要反编译别人的apk,当然主要目的还是为了学习到更多,取彼之长,补己之短。今天就来总结一下Androi
- 对于生成的sql语句 自动加上单引号的情况mybatis是这样的,如果表的字段跟系统字段冲突,写sql语句的时候必须得加上单引号,这样才会区
- 在上一节,我们已经完成了项目的整体技术架构设计和具体的数据库设计,接下来,我们搭建整体的开发框架。开发工具选用Idea。开发工具只是为了提高
- 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。对于文件上传,浏览器在上
- 本文实例讲述了C#实现动态加载dll的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Co
- OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。本文对OAuth 2.0的
- 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题,不过俺从没看过出错的现象,表鄙视我……public class Singleton
- 本文需求实现了java通过方向键控制小球移动的具体过程,供大家参考,具体内容如下需求分析:第一 要画出一个小球第二 要能通过控制方向键控制它
- JDK JRE JVMJDK:Java标准开发包,它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行时环境
- 本文实例讲述了C#中数组初始化、反转和排序用法。分享给大家供大家参考。具体如下:下面的代码演示了在C#中定义和初始化数组,然后对其进行赋值,