gridview向右点击,到下一行,循环滚动
2015-09-16 20:50
537 查看
转载请注明出处:/article/8093871.html
提前声明:本篇博客是基于电视机顶盒的,全部操作是用遥控器。
如下图所示:
![](http://img.blog.csdn.net/20150916202638721?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
此时焦点位于项目3的位置,再次点击遥控器的向右按钮,则跳转到第二行的第一个,即项目4的位置。
这个功能,主要用到了以下的两个代码。
if (ikeyCode == KeyEvent.KEYCODE_DPAD_RIGHT
&& event.getAction() == KeyEvent.ACTION_DOWN)
setSelection(position + 1)
我将整体功能,封装了一个类,里面有详细的注释。
注意:这个类里面也有在某一行的第一列,点击遥控器的左键,向上移动。
ManiActivity里的方法如下所示:
本项目的下载地址为:http://download.csdn.net/detail/harryweasley/9112485
注意:这里再记录一个方法,可以直接调用onkeyListnre方法:
提前声明:本篇博客是基于电视机顶盒的,全部操作是用遥控器。
如下图所示:
此时焦点位于项目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);
相关文章推荐
- FreeMarker全面教程
- 简单的快速幂
- NEERC 2014 Problem B. Burrito King
- net-snmp5.7.3移植到arm-linux平台
- Linux基础篇-压缩、解压缩命令
- Android中自制各种进度条的实现
- Axis与Spring的集成
- Could not resolve com.android.support:appcompat-v7:22.2.1
- intent
- 变量名的力量(一)
- LNMP的并发考虑与资源分配
- servlet中的各种编码
- C# 生成CODE128条码
- ios-新浪微博开发07-自定义搜索框
- 统计文件中的单词个数
- javascript 回调函数用法演示
- hdu1506Largest Rectangle in a Histogram
- systemtap 用户态调试2
- NGUI的UI Root
- 关于C#文件复制(递归)