gridview向右点击,到下一行,循环滚动


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


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


如下图所示:



此时焦点位于项目3的位置,再次点击遥控器的向右按钮,则跳转到第二行的第一个,即项目4的位置。



这个功能,主要用到了以下的两个代码。


if (ikeyCode == KeyEvent.KEYCODE_DPAD_RIGHT
&& event.getAction() == KeyEvent.ACTION_DOWN) 



setSelection(position + 1)


我将整体功能,封装了一个类,里面有详细的注释。


package com.example.demo;

import android.util.Log;
import android.view.KeyEvent;
import android.widget.GridView;


public class GridViewItemOrderUtil {
	/**
	 * 让该gridView运行到一行的最后一列,点击右键,跳到下一行的第一列;运行到一行的第一列,点击左键,跳转到上一行的最后一列
	 * 
	 * @param gridView
	 *            该gridView
	 * @param size
	 *            总共的项目数目,从1开始
	 * @param columnNum
	 *            列数目,即每一行有多少列,从1开始
	 * @param position
	 *            当前的位置,从0开始
	 * @param keyCode
	 * 
	 * @param event
	 */
	public static void lastToNextFirst(GridView gridView, int size,
			int columnNum, int position, int keyCode, KeyEvent event) {
		boolean isLast = isAnyLineLast(size, columnNum, position);
		boolean isFirst = isAnyLineFirst(size, columnNum, position);
		Log.i("tag", event.getAction() + "onkeyLis执行了" + keyCode);

		if (isLast && keyCode == KeyEvent.KEYCODE_DPAD_RIGHT
				&& event.getAction() == KeyEvent.ACTION_DOWN) {
			gridView.setSelection(position + 1);
		}

		if (isLast && keyCode == KeyEvent.KEYCODE_DPAD_DOWN
				&& event.getAction() == KeyEvent.ACTION_DOWN) {
			gridView.setSelection(position + 7);
		}

		if (isFirst && keyCode == KeyEvent.KEYCODE_DPAD_LEFT
				&& event.getAction() == KeyEvent.ACTION_DOWN) {
			gridView.setSelection(position - 1);
		}
	}

	/**
	 * 让该gridView运行到一行的最后一列,点击右键,跳到下一行的第一列
	 * 
	 * @param gridView
	 *            该gridView
	 * @param size
	 *            总共的项目数目,从1开始
	 * @param columnNum
	 *            列数目,即每一行有多少列,从1开始
	 * @param position
	 *            当前的位置,从0开始
	 * @param keyCode
	 * 
	 * @param event
	 */
	public static void onlyTopTpBottom(GridView gridView, int size,
			int columnNum, int position, int keyCode, KeyEvent event) {
		boolean isLast = isAnyLineLast(size, columnNum, position);

		if (isLast && keyCode == KeyEvent.KEYCODE_DPAD_RIGHT
				&& event.getAction() == KeyEvent.ACTION_DOWN) {
			gridView.setSelection(position + 1);
		}

	}

	/**
	 * 判断是否(到某一页的完整最后一行并且点击向下)
	 * 
	 * 
	 * @param size
	 *            总共的项目数目,从1开始
	 * @param columnNum
	 *            列数目,即每一行有多少列,从1开始
	 * @param position
	 *            当前的位置,从0开始
	 * @param rawInPage
	 *            每一页有完整的几行,从1开始
	 * @param keyCode
	 * 
	 * @param event
	 */
	public static boolean allPageDown(int size, int columnNum, int position,
			int rawInPage, int keyCode, KeyEvent event) {
		// 每一个页有多少个完整的item
		int itemAPage = columnNum * rawInPage;
		// 每一个页的最后一行的第一个数字
		int num = itemAPage - columnNum;
		// 求出一共有多少页
		int rawNum = size / itemAPage;
		for (int i = 1; i <= rawNum; i++) {
			for (int j = 0; j < columnNum; j++) {
				// 每行有多少列,进行多少次相加
				if (position == num + itemAPage * (i - 1) + j) {
					if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN
							&& event.getAction() == KeyEvent.ACTION_DOWN) {
						// 如果有相等,则立即返回true,不再进行判断
						return true;
					}
				}
			}

		}
		return false;
	}

	/**
	 * 判断是否(到某一页的第一行并且点击向上按钮)
	 * 
	 * 
	 * @param size
	 *            总共的项目数目,从1开始
	 * @param columnNum
	 *            列数目,即每一行有多少列,从1开始
	 * @param position
	 *            当前的位置,从0开始
	 * @param rawInPage
	 *            每一页有完整的几行,从1开始
	 * @param keyCode
	 * 
	 * @param event
	 */
	public static boolean allPageUp(int size, int columnNum, int position,
			int rawInPage, int keyCode, KeyEvent event) {

		// 每一个页有多少个完整的item
		int itemAPage = columnNum * rawInPage;
		// 求出一共有多少页+1
		int rawNum = size / columnNum + 1;
		for (int i = 1; i <= rawNum; i++) {
			for (int j = 0; j < columnNum; j++) {
				// 每行有多少列,进行多少次相加
				if (position == itemAPage*i + j) {
					if (keyCode == KeyEvent.KEYCODE_DPAD_UP
							&& event.getAction() == KeyEvent.ACTION_DOWN) {
						// 如果有相等,则立即返回true,不再进行判断
						return true;
					}
				}
			}

		}
		return false;
	}

	/**
	 * 判断是否是每一行的最后一个项目
	 * 
	 * @param size
	 *            总共的项目数目,从1开始
	 * @param columnNum
	 *            列数目,即每一行有多少列,从1开始
	 * @param position
	 *            当前的位置,从0开始
	 * @return true代表是,false代表不是
	 */
	public  static boolean isAnyLineLast(int size, int columnNum, int position) {
		// 求出一共有多少行
		int rawNum = size / columnNum + 1;
//		Log.i("tag", "一共有多少行" + rawNum);
		for (int i = 1; i <= rawNum; i++) {
			if (position == columnNum * i - 1) {
				// 如果当前位置是每一行的最后一列,则返回true
				return true;
			}
		}
		return false;

	}

	/**
	 * 判断是否是每一行的第一个项目
	 * 
	 * @param size
	 *            总共的项目数目,从1开始
	 * @param columnNum
	 *            列数目,即每一行有多少列,从1开始
	 * @param position
	 *            当前的位置,从0开始
	 * @return true代表是,false代表不是
	 */
	public static boolean isAnyLineFirst(int size, int columnNum, int position) {
		// 求出一共有多少行
		int rawNum = size / columnNum + 1;
		Log.i("tag", "一共有多少行" + rawNum);
		// 并不需要判断第一行,直接从第二行开始
		for (int i = 2; i <= rawNum; i++) {
			if (position == columnNum * i - columnNum) {
				// 如果当前位置是每一行的最后一列,则返回true
				return true;
			}
		}
		return false;

	}
}


注意:这个类里面也有在某一行的第一列,点击遥控器的左键,向上移动。



ManiActivity里的方法如下所示:

package com.example.demo;

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 {

	private GridView gv;
	/**
	 * 当前选择的位置
	 */
	private int selected;

	@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;

			}

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

			}
		});
		
		gv.setOnKeyListener(new OnKeyListener() {
			
			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				
				GridViewItemOrderUtil.onlyTopTpBottom(gv, 20,
						3, selected, keyCode, event);
				
				
				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/9112485


注意:这里再记录一个方法,可以直接调用onkeyListnre方法:

KeyEvent  event=new KeyEvent(KeyEvent.ACTION_DOWN,1);
		
		view.onKeyDown( KeyEvent.KEYCODE_DPAD_RIGHT, event);





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值