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

标签:Android,LinearLayout,PullRefreshView,翻页
0
投稿

猜你喜欢

  • kafka的消息存储机制和原理分析

    2022-02-01 13:07:39
  • Android选择图片或拍照图片上传到服务器

    2022-12-15 01:48:41
  • 基于JDK动态代理原理解析

    2022-07-24 19:43:33
  • C#中Winform窗体Form的关闭按钮变灰色的方法

    2023-06-06 09:11:34
  • 基于C语言实现静态通讯录的示例代码

    2023-07-02 22:07:38
  • Java实现简单班级管理系统

    2023-01-07 16:20:29
  • C#对文件名智能排序的算法

    2022-05-02 16:18:28
  • android BitmapFactory.Options使用方法详解

    2023-05-04 08:50:20
  • springboot+chatgpt+chatUI Pro开发智能聊天工具的实践

    2023-10-30 05:38:03
  • RestTemplate在Spring或非Spring环境下使用精讲

    2022-03-03 07:35:41
  • Android应用的多语言支持的实现方法

    2023-07-09 18:26:43
  • java编程枚举类型那些事!枚举类型定义和重写枚举的方法

    2021-11-19 18:31:15
  • Android自定view画圆效果

    2021-06-05 21:45:52
  • Android Textview实现颜色渐变滚动效果

    2023-08-28 05:30:08
  • 通俗讲解JVM的类加载机制

    2023-01-03 03:35:03
  • Android检测Activity或者Service是否运行的方法

    2021-09-03 00:52:00
  • Spring配置中transactionAttributes的使用方法介绍

    2021-06-16 10:59:05
  • C#游戏开发之实现华容道游戏

    2023-01-03 03:17:20
  • Android自定义软键盘的步骤记录

    2023-04-08 07:05:50
  • Android键盘显示与隐藏代码

    2021-06-29 22:15:58
  • asp之家 软件编程 m.aspxhome.com