gridview整页翻页的滑动,上滑和下滑

原创 2015年07月07日 09:00:00


提前声明:本篇博客是基于电视机顶盒的,全部操作是用遥控器。

转载请注明出处:http://blog.csdn.net/harryweasley/article/details/46784667


在看本篇文章之前,你需要了解平滑滚动的相关知识。

关于gridview的平滑滚动,你可以查看http://blog.csdn.net/harryweasley/article/details/46714059



先看下本应用的截图,如图所示:


本例子是一页有6个完整的item,相信大家都看出来了。


整理成excel的文档来看下,如下图所示:



其中标红的,就是每一页的完整最后一行的第一个位置。


思路是这样的:假设gridview在3的位置,当我再次向下点击按钮的时候,整个页码翻动,翻动到6的位置,并且6是和最顶边靠齐。


如图所示:



假设gridview现在在6的位置,当我再次点击向上按钮的时候,整个页码向上翻动,和之前的页面一模一样。





总体功能在这里:

package com.example.test;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnKeyListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends Activity {

	GridView gv;
	/**
	 * 选择的position的值
	 */
	int selected;
	/**
	 * 是否有向上的动画
	 */
	boolean isUp = false;
	/**
	 * 是否有向下的动画
	 */
	boolean isDown = false;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		gv = (GridView) findViewById(R.id.gridview);
		gv.setAdapter(new MyBaseAdapter(this));

		gv.setOnItemSelectedListener(new OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
				selected = position;

				if (isDown) {
					isDown = false;
					gv.smoothScrollToPositionFromTop(position, 0, 1000);
				}
				if (isUp) {
					isUp = false;
					// 让该页的第一行对齐最顶边
					gv.smoothScrollToPositionFromTop(position - 3, 0, 1000);
				}
			}

			@Override
			public void onNothingSelected(AdapterView<?> parent) {

			}
		});

		gv.setOnKeyListener(new OnKeyListener() {

			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				// 如果在某一页的完整最后一行,并且点击向下按钮
				if (isAllPageDown() && keyCode == KeyEvent.KEYCODE_DPAD_DOWN
						&& event.getAction() == KeyEvent.ACTION_DOWN) {

					isDown = true;
				}

				// 如果在每一页的第一行并且点击向上按钮
				if (isAllPageUp() && keyCode == KeyEvent.KEYCODE_DPAD_UP
						&& event.getAction() == KeyEvent.ACTION_DOWN) {
					isUp = true;
				}

				return false;
			}
		});
	}

	// 是否在某一页的完整最后一行
	private boolean isAllPageUp() {
		// 求出一共有多少页,这里不需要-1,因为向上滑动需要最后的那一行
		int rawNum = 20 / 6 + 1;
		for (int i = 1; i <= rawNum; i++) {
			if (selected == 6 * i) {
				return true;
			}
			if (selected == 6 * i + 1) {
				return true;
			}
			if (selected == 6 * i + 2) {
				return true;
			}

		}
		return false;
	}

	// 如果在某一页的完整最后一行,并且点击向下按钮
	private boolean isAllPageDown() {
		// 求出一共有多少页-1,因为向下滑动不需要最后的那一行
		int rawNum = 20 / 6;
		for (int i = 1; i <= rawNum; i++) {
			if (selected == 3 + 6 * (i - 1)) {
				return true;
			}
			if (selected == 3 + 6 * (i - 1) + 1) {
				return true;
			}
			if (selected == 3 + 6 * (i - 1) + 2) {
				return true;
			}

		}
		return false;
	}

	class MyBaseAdapter extends BaseAdapter {
		private Context context;
		ArrayList<Integer> list = new ArrayList<Integer>();

		public MyBaseAdapter(Context context) {
			this.context = context;
			for (int i = 0; i < 20; i++) {
				list.add(i);
			}
		}

		@Override
		public int getCount() {

			return list.size();
		}

		@Override
		public Object getItem(int position) {

			return null;
		}

		@Override
		public long getItemId(int position) {

			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder holder;
			if (convertView == null) {
				convertView = LayoutInflater.from(context).inflate(
						R.layout.item_program, parent, false);
				holder = new ViewHolder();
				holder.imageView = (ImageView) convertView
						.findViewById(R.id.program_image);
				holder.name = (TextView) convertView
						.findViewById(R.id.program_name);
				convertView.setTag(holder);
			} else {
				holder = (ViewHolder) convertView.getTag();
			}
			holder.name.setText("应用" + list.get(position));
			return convertView;
		}

		class ViewHolder {
			ImageView imageView;
			TextView name;
		}

	}

}



整个代码已经上传,下载路径为:http://download.csdn.net/detail/harryweasley/8874079


你看到我这篇文章,每行是3个item,一页2行,一页一共有6个item,那么如果是其他的情况,又该如何处理呢?

下一篇文章,我将进行总结,写出适应各种gridview的页面布局的方法,文章链接http://blog.csdn.net/harryweasley/article/details/46811981


笔记5 | 监听scroollview、listview、gridview页面滑动,判断是否滑动到顶部以及底部

监听scroollview、listview、gridview页面滑动,判断是否滑动到顶部以及底部

Android_GridView_GridView概述及实现水平滑动

GridView是ViewGroup子类,主要用于显示在一个二维可滚动的网格,比如九宫格。使用gridview和listview类似,都是使用ListAdapter来填充数据加载布局,如果以列间距拉伸...

GridView左右滑动的实现(一)

GridView左右滑动的实现(一)              在外面编写日历代码时,如果只是实现点击按钮来实现上一页或者是下一页的显示,这样就out了,而且但是不完美的。现在我们一般用的是智能手机...

Android中GridView水平滚动和垂直滚动的实现(动态)

经过本人实验,完美实现水平滚动和垂直滚动。话不多说,先看布局文件: ...

【Android实战】HorizontalScrollView实现可滑动GridView

HorizontalScrollView实现可滑动GridView

GridView控件实现分页功能

初识ASP.NET中的控件,还是折腾了一小会儿,就把我折腾的结果给大家看看: 表格显示数据时网站开发中的一个常见的功能,ASP.NET提供了很多工具在网页中显示表格,GridView控件就是最常见的...

android GridView 在TV上,上下翻页的时候平滑滑动的实现

应该做过android tv开发的同学都知道,在TV上使用GridView的时候,如果焦点上下移动的时候,如果移动到在屏幕上可见的第一行或者最后一行的时候,如果再继续上下移动, 的话,是比较生硬呆滞...

gridview整页翻页的滑动,上滑和下滑,适应各种布局

提前声明:本篇博客是基于电视机顶盒的,全部操作是用遥控器。 在看这篇文章之前,你有必要去了解一下我的上一篇文章,http://blog.csdn.net/harryweasley/article/d...

android --解决GridView上下滑动出现错位问题

最近在做电子书项目,书架是通过自定义的GridView实现的,在GridView上下滑动的过程中经常会产生数据紊乱等问题, 尝试了很多方式解决,数据项检查都正常,但是还是不能够解决,最终通过度娘得到...

Android之禁止GridView上下滑动

在Android开发中,我们经常使用到GridView控件,并且需要禁止GridView上下滑动,但是,Android并没有提供对应的API来禁止GridView上下滑动,也没有在XML布局文件中提供...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:gridview整页翻页的滑动,上滑和下滑
举报原因:
原因补充:

(最多只允许输入30个字)