Android编程使用LinearLayout和PullRefreshView实现上下翻页功能的方法
本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《Android布局layout技巧总结》、《Android开发动画技巧汇总》、《Android开发入门与进阶教程》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android资源操作技巧汇总》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。
- BZOJ 3098: Hash Killer II(新生必做的水题)
- [接口测试 - 基础篇] 04 无法绕过的json解析
- 【专知-PyTorch手把手深度学习教程02】CNN快速理解与PyTorch实现: 图文+代码
- [接口测试 - 基础篇] 03 unittest测试框架了解多少才够?
- 关关的刷题日记09——Leetcode 80. Remove Duplicates from Sorted Array II
- [linux][kernel]dump kmsg到文件系统中
- [接口测试 - 基础篇] 12 还是要掌握python日志管理模块的
- Spring整合Quartz分布式调度
- [接口测试 - 基础篇] 11 掌握下python解析YAML格式也是需要的
- 如何用Python创建眼下火爆的区块链?这篇干货请收藏
- [接口测试 - 基础篇] 10 别啊,还有INI格式呢,别忘记我
- [接口测试 - 基础篇] 09 其实吧,读写csv格式也是要掌握的
- 【源码分享】机器学习之Python支持向量机
- [接口测试 - 基础篇] 08 封装个基本的excel解析类
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Django REST Swagger实现指定api参数
- matplotlib.pyplot.matshow 矩阵可视化实例
- php+mysql开发的最简单在线题库(在线做题系统)完整案例
- python中元组的用法整理
- PHP错误提示It is not safe to rely on the system……的解决方法
- PHP使用mysqli同时执行多条sql查询语句的实例
- 在tensorflow下利用plt画论文中loss,acc等曲线图实例
- PHP生成短网址的思路以及实现方法的详解
- ThinkPHP 3.2.3实现加减乘除图片验证码
- Python数据相关系数矩阵和热力图轻松实现教程
- PHP中md5()函数的用法讲解
- thinkPHP框架实现的简单计算器示例
- Keras在训练期间可视化训练误差和测试误差实例
- Laravel如何自定义command命令浅析
- wordpress自定义标签云与随机获取标签的方法详解