使用LinearLayout和PullRefreshView实现上下翻页

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">之前看过网易云阅读客户端,里面的文章可以实现上下拉动实现上下翻页的效果,感觉体验效果很不错。</span>

公司新版本项目的开发中也要求实现类似的效果,不过还好项目需求里面可以提前知道需要实现上下拉动翻页的总的页数。如果像网易那种不提前知道总的页数感觉控制好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

时间: 2024-08-11 16:07:14

使用LinearLayout和PullRefreshView实现上下翻页的相关文章

Linux(CentOS)安装Oracle_11g_r2数据库(四)支持sqlplus上下翻页

下载地址:http://down.51cto.com/data/2277765 Oracle数据库使用时,因为不能上下翻页之前的命令,非常不方便.所以安装"rlwrap"来解决. 安装命令,注意安装是要在root用户下. # tar -xf rlwrap-0.42.tar.gz  # cd rlwrap-0.42 # ./configure  # make && make install 编译安装完成 在Oracle用户的变量文件.bash_profile文件里追加下面

在UITableView中识别作用滑动,实现上下翻页的功能

目前有三种方案: 1. UIScrollView + UITableView. 实现方法,在UIScrollView中,加入UITableView即可 设置UIScrollView的代理和方法 - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ int currentPostion = scrollView.contentOffset.x; if (currentPostion - 0 > 50) { NSLog(@"Scroll

在PHP当中制作隔行换色的效果以及制作上下翻页的效果!

首先说明隔行换色的效果,需要用到tr:nth_child(odd);或者括号里的值是even,odd是从第一行开始隔一行,even是从第二行开始: 具体代码如下图案所示: 1 <style> 2 /*tr:nth-child(even){*/ 3 /*background: #cad9ea;*/ 4 /*}*/ 5 </style> 在数据库当中查询第几条开始和我们需要显示的数据只要几条:我们可以用到limin语句,具体代码如下: 1 $sql = "select * f

UITableView中识别左右滑动,实现上下翻页的功能

目前有三种方案: 1. UIScrollView + UITableView. 实现方法,在UIScrollView中,加入UITableView即可 设置UIScrollView的代理和方法 - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ int currentPostion = scrollView.contentOffset.x; if (currentPostion - 0 > 50) { NSLog(@"Scroll

rlwrap-0.37.tar.gz实现sqlplus上下翻页

1.上传rlwrap-0.37.tar.gz到linux 2.解压rlwrap-0.37.tar.gz [[email protected] mnt]# tar zxvf rlwrap-0.37.tar.gz [[email protected] mnt]# ls rlwrap-0.37  rlwrap-0.37.tar.gz 2.安装软件 [[email protected] rlwrap-0.37]# cd rlwrap-0.37 [[email protected] rlwrap-0.37

oracle的环境配置-实现oracle sqlplus的上下翻页

安装rlwrap-0.37.tar.gz工具--实现SQLPLUS中记忆和上下翻页功能 在rpm10g32这个路径中 1.解压缩 [[email protected] ~]# cd /u01/rpm10g32[[email protected] rpm10g32]# tar -zxvf rlwrap-0.37.tar.gz 2.安装[[email protected] rpm10g32]# cd  rlwrap-0.37  --root下安装,安装的时候可能会缺包,read-line.readl

用rlwrap使sqlplus可以上下翻页

下载rlwrap-0.30 从光盘上安装readline-devel和readline 安装rlwrap: #tar -zxvf rlwrap-0.30.tar.gz#cd rlwrap-0.30#./configure #make #make install 修改环境变量:添加alias sqlplus='rlwrap sqlplus'alias rman='rlwrap rman'

sqlplus实现上下翻页设置

环境: 操作系统:red hat 5.8 OS 数据库:oracle 11g 11.2.0.1 安装软件:IO-Tty-1.07.tar. Term-ReadLine-Gnu-1.16.tar.uniread-1.01.tar ftp工具:winscp 1.将安装软件通过winscp上传到linux系统 2.root用户登陆linux系统,解压安装软件 #tar zxvf IO-Tty-1.07.tar #tar zxvf Term-ReadLine-Gnu-1.16.tar # tar zxv

thinkcmf上下翻页

<if condition="!empty($prev)"> <a href="{:leuu('article/index',array('id'=>$prev['object_id'],'cid'=>$prev['term_id']))}" class="btn btn-primary pull-left">上一篇</a> </if> <if condition="!e