Android编程使用LinearLayout和PullRefreshView实现上下翻页功能的方法

发布时间 - 2026-01-11 02:48:08    点击率:

本文实例讲述了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程序设计有所帮助。


# Android  # LinearLayout  # PullRefreshView  # 翻页  # Android LinearLayout实现自动换行效果  # Android LinearLayout实现自动换行  # Android自定义LinearLayout布局显示不完整的解决方法  # Android使用LinearLayout设置边框  # android中LinearLayoutManager一键返回顶部示例  # Android中的LinearLayout布局  # Android基础之获取LinearLayout的宽高  # Android超详细讲解组件LinearLayout的使用  # 是一个  # 网易  # 自己的  # 的是  # 进阶  # 操作技巧  # 是在  # 相关内容  # 第一个  # 也可  # 感兴趣  # 这两个  # 给大家  # 很不错  # 然后再  # 可以实现  # 中也  # 更多关于  # 具体情况 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  Java垃圾回收器的方法和原理总结  Laravel如何使用.env文件管理环境变量?(最佳实践)  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  佛山网站制作系统,佛山企业变更地址网上办理步骤?  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  5种Android数据存储方式汇总  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Laravel如何实现一对一模型关联?(Eloquent示例)  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  Laravel如何自定义错误页面(404, 500)?(代码示例)  怎么用AI帮你为初创公司进行市场定位分析?  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  详解Android——蓝牙技术 带你实现终端间数据传输  大型企业网站制作流程,做网站需要注册公司吗?  网站图片在线制作软件,怎么在图片上做链接?  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  如何为不同团队 ID 动态生成多个独立按钮  网站建设保证美观性,需要考虑的几点问题!  北京的网站制作公司有哪些,哪个视频网站最好?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  如何快速搭建FTP站点实现文件共享?  Linux系统命令中screen命令详解  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  Laravel如何使用Blade组件和插槽?(Component代码示例)  使用spring连接及操作mongodb3.0实例  Python自动化办公教程_ExcelWordPDF批量处理案例  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  制作企业网站建设方案,怎样建设一个公司网站?  如何在建站之星绑定自定义域名?  如何在宝塔面板中修改默认建站目录?  七夕网站制作视频,七夕大促活动怎么报名?  Laravel如何使用Livewire构建动态组件?(入门代码)  如何将凡科建站内容保存为本地文件?  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  如何在IIS中配置站点IP、端口及主机头?  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  大连 网站制作,大连天途有线官网?  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  如何在万网自助建站平台快速创建网站?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  如何在香港服务器上快速搭建免备案网站?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  JavaScript如何实现类型判断_typeof和instanceof有什么区别  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】