Android TV开发经验总结---控件Gridview使用

GridView控件的使用(一) GridView它是一个强大的数据绑定控件,能够灵活地显示和编辑数据源中的数据。 阅读详情

    前一篇我们已经讲解的基本Android TV 开发的基础技能Android TV开发经验总结---初识TV开发,接下来聊聊TV开发中所涉及到的控件运用

    目前Android TV 开发的资料不是蛮多,经过一系列的搜索,目前比较适用的框架推荐 

     冰雪情缘TV / Android-TV-Frame    项目地址:https://git.oschina.net/hailongqiu/AndroidTVWidget

     在我们TV开发中用到最多的可能就是网格和列表了,今天我们先讲讲GridView,有人就会想现在不都是在用recyclerview吗? 但是我告诉你,在TV开发中目前如果不使用google自己的LeackbackTV框架的话目前的原生recyclerview在开发中你会发现,上下左右快速滑动的时候焦点不能预期的达到效果,当然后面我会讲解recyclerview在开发过程中的使用

     系统中的原生GridView在开发过程中会出现哪些问题呢,我们又可以怎么解决?

     首先为了让GridView能够上下左右焦点位置不乱跑,我使用的是Androd-tv-frame中的GridViewTV控件,具体代码请看上面连接中的源码

     然后在使用GridView过程中一般需要用到的监听事件

     gridView.setOnItemSelectedListener     选中事件

<pre name="code" class="java">    //选中事件
    gridView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){
        @Override
        public void onItemSelected (AdapterView < ? > parent, View view,int position, long id){
                curposition = position;
         }
        @Override public void onNothingSelected (AdapterView < ? > parent){
        }
    });
    
    //点击事件 
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
        @Override public void onItemClick (AdapterView < ? > parent, View view,int position, long id){
        }
    });
    
    //是否获取焦点事件
    gridView.setOnFocusChangeListener(new View.OnFocusChangeListener(){
        @Override public void onFocusChange (View view,boolean b){
        }
    });


 

 
 

        此处需要特别说明的是    gridView.setFocusable(true);   改变控件是否可以获得焦点,然而同时会触发 setOnFocusChangeListener事件 

        在GridView开发过程中还有很坑爹的问题,GridView在初始化或者重新setAdapter后在4.3版本以上会抢焦点默认选中第一个Item ,不光是GridView listview也是如此的情况,所以要避免这种情况的话需要给gridView.setFocusable(false)使得gridview不能抢焦

       其实在开发中如果在4.3版本一下你需要默认第一个Item也是有方法的,可以看看

GridView第一次选中不调用onItemSelected()的解决办法    利用反射促使第一次也调用

      接着说说我们在GridView开发中需要判断是否焦点在Item边缘地带了可以使用如下方法做判断,仅供参考需要自己完善自己逻辑
      
/**
     * 判断当前选中的位置在屏幕中的相对位置
     *
     * @param
     * @return
     */
    public static final int LEFT = 0;
    public static final int RIGHT = 1;
    public static final int BOTTOM = 2;
    public static final int TOP = 3;
    public int getGridSelectionState() {
        int selection = gridView.getSelectedItemPosition();
        int total = mLiveData.size();
        if (total <= 0) {
            return -1;
        }

        if(selection<gridView.getNumColumns()){
            return TOP;
        }

        if (selection + gridView.getNumColumns() >= total) {
            return BOTTOM;
        }
        if (selection % gridView.getNumColumns() == 0) {
            return LEFT;
        } else if (selection % gridView.getNumColumns() == gridView.getNumColumns()-1) {
            return RIGHT;
        } else {
            return -1;
        }
    }
       如果这时候你还需要通过方向来确定的话可以使用如下代码
private int direction = -1;
	@Override
	public boolean dispatchKeyEvent(KeyEvent event) {
		switch (event.getKeyCode()) {
			case KeyEvent.KEYCODE_DPAD_LEFT:
				direction = 1;
				break;
			case KeyEvent.KEYCODE_DPAD_RIGHT:
				direction = 2;
				break;
			case KeyEvent.KEYCODE_DPAD_UP:
				direction = 3;
				break;
			case KeyEvent.KEYCODE_DPAD_DOWN:
				direction = 4;
				break;
			default:
				direction = -1;
				break;
		}
		return super.dispatchKeyEvent(event);
	}

     有的时候我们需要分页加载数据怎么办,我的思路是判断当前选中的Item的位置是否在最底下,如果是就进行网络请求,在页面的OnkeyDown事件中监听,其实将逻辑封装在自定义Gridview中然后暴露回调接口出来
    
@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_DPAD_DOWN:
                if (isGridFoucse) {  //<isGridFoucse标示Gridview是否获取了焦点
                    if (getGridSelectionState() == BOTTOM && isHaveMore) {  //翻页
                        //TODO:加载数据
                        return true;
                    }

                }
                break;
        }
        return false;


    }

 接着可能就是选中放大的效果了,之前我一直使用的还是上面框架中的放大效果,移动放大框效果很给力,只是在过程中你特别需要注意设置两个属性

android:clipToPadding="false"    android:clipChildren="false"    具体有什么用处你可以问问度娘,会解释的很清楚。

但是由于后期配合项目整体UI的要求,框架不适合,那么又如何有放大选中的效果呢,我的思路是设置Item放大后的背景,先隐藏当选中的时候对View进行放大正好是背景的大小,这就需要我们自己计算Item的宽高了,给个我实现的案例

先看看xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="@dimen/px449"
    android:layout_height="@dimen/px323"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/root_layout"
        android:layout_width="@dimen/px400"
        android:layout_height="@dimen/px286"
        android:layout_centerInParent="true"
        android:background="@drawable/shape_rect_grid_item_bg"
        android:orientation="vertical"
        android:padding="@dimen/px4">

     

    </LinearLayout>

    <View
        android:id="@+id/grid_border"
        android:layout_width="@dimen/px449"
        android:layout_height="@dimen/px322"
        android:layout_centerInParent="true"
        android:background="@drawable/border_bg"
        android:focusable="false"
        android:visibility="invisible"/>
</RelativeLayout>

然后就是在选中中放大效果

gridView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                                       int position, long id) {
                if (isGridFoucse && view != null) {
                    if (mOldView != null) {
                        LiveGridAdapter.ViewHolder oldholder = (LiveGridAdapter.ViewHolder) mOldView.getTag();
                        setGridBg(oldholder,false);
                    }
                    if (view != null) {
                        LiveGridAdapter.ViewHolder holder = (LiveGridAdapter.ViewHolder) view.getTag();
                        view.bringToFront();
                        setGridBg(holder, true);
                    }
                    mOldView = view;
                    curposition = position;
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
		
		
		private void setGridBg(final LiveGridAdapter.ViewHolder oldholder,boolean toBig){
        if(toBig){
            oldholder.root_layout.animate().scaleX(1.09f).scaleY(1.09f).setDuration(DEFAULT_TRAN_DUR_ANIM)
                    .setListener(new Animator.AnimatorListener() {
                        @Override
                        public void onAnimationStart(Animator animation) {
                            if (oldholder.grid_border != null) {
                                oldholder.grid_border.setVisibility(View.VISIBLE);
                            }
                        }
                        @Override
                        public void onAnimationEnd(Animator animation) {

                        }
                        @Override
                        public void onAnimationCancel(Animator animation) {
                        }
                        @Override
                        public void onAnimationRepeat(Animator animation) {
                        }
                    });
        }else{
            oldholder.root_layout.animate().scaleX(1.0f).scaleY(1.0f).setDuration(DEFAULT_TRAN_DUR_ANIM)
                    .setListener(new Animator.AnimatorListener() {
                        @Override
                        public void onAnimationStart(Animator animation) {
                            if (oldholder.grid_border != null) {
                                oldholder.grid_border.setVisibility(View.INVISIBLE);
                            }
                        }

                        @Override
                        public void onAnimationEnd(Animator animation) {
                        }

                        @Override
                        public void onAnimationCancel(Animator animation) {
                        }

                        @Override
                        public void onAnimationRepeat(Animator animation) {
                        }
                    });
        }
    }

其实网上还有很多自定义Gridview 的放大效果,大家可以去搜索下看看



     

安卓TV开发(六) 移动智能终端UI之实现类似GridView的焦点控制FocusView框架 到这里,所有关于智能设备的UI绘制技巧以及全部讲完了,回顾五篇文章,如果成为一个自己定义布局或者控件高手,我们不仅要掌握安卓view的生命周期,事件的机制,动画的类型,还要有java Swiing绘图功底,而且还要有一定的设计思想功底,这样自己写出的view才能让别人加以利用和扩展,总之学习是循环渐进,不断提高的。虽然本次Foucus能满足大部分非触摸屏设备上的UI需求,但是万变不离其宗,更多好的功能还需要朋友们自己挖掘和扩展。 阅读详情

相关推荐

Android TV (三)(创建电视页面布局)

官方地址 镜像地址创建电视页面布局用户通常在距离电视屏幕10英尺的位置观看,并且它远远大于大多数Android设备的显示屏,但是这种类型的屏幕不能提供与小屏幕相同级别的细节和颜色。这些因素要求你为电视设备创建应用布局时,能创造一个有效的和愉快的用户体验。使用布局主题Android主题能为你的应用提供基础的布局。您应该使用一个主题来修改您的应用程序的activity的显示,这意味着这些activity

fengfancky的博客 3477

Android【GridView使用】

安卓GridView使用实例 GridView与ListView的用法基本一致,不同的只是布局。当我们打开手机,应用会以宫格显示,那就是GridView。 以代码形式展示,本次适配器使用BaseAdapter,熟悉了适配器的用法,就只需要注意几个GridView的属性即可。 1、GridView首先必须了解的地方???? GridView组件用来以网格方式排列视图,与矩阵类似,当屏幕上有很多元素(文字、图片或其他元素)需要显示时,可以使用该组件 GridView是一个在二维可滚动的网格中展示内容

w_Eternal的博客 1万+

Android GridView使用(详细版)

在学习GridView 之前,我们需要先了解GridView的继承关系,GridView跟ListView很类似,Listview主要以列表形式显示数据,GridView则是以网格形式显示数据,掌握ListView使用方法后,会很轻松的掌握GridView的使用方法。

轻描时光 2153

【Android从零单排系列二十二】《Android视图控件——GridView》

小伙伴们,在上文中我们介绍了Android视图组件ExpandableListView,本文我们继续盘点,介绍一下视图控件的GridView。GridView是一个在Android中常用的布局控件,它可以以网格形式展示数据,类似于表格或者矩阵。GridView可以按照指定的行数和列数将数据显示在多个单元格中,使得数据呈现出规律的排列方式。GridView通过Adapter来提供数据,并且可以自定义每个单元格的布局。用户可以自定义Adapter来适配各种数据源,并为每个单元格设置不同的视图样式和内容。

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 4043

Android TV,机顶盒Gridview 焦点

切换两个控件之间的焦点,TV、机顶盒用android自带的控件 例如listview或者gridview 是,因为需要适配手机等,所以控件某些方面(如每个控件的焦点,切换时的速度,位置等)是不会很匹配TV、机顶盒的.最好的方法是自己绘制一个gridview <GridView android:id="@+id/lv_main" android:layout_width="wrap_content" android:layout_height="wrap_

码点 748

Android TV GridView的Item焦点处理以及滚动条不能滚动的解决方案

前言 在Android Tv开发中,会涉及到对GridView控件的焦点处理,来支持遥控器的上下左右的操作,但是也会遇到一些坑,比如说Item获取到焦点后,滚动条不能滚动,下面就解决方案做个笔记仅供参考 1.Item获取焦点 <GridView android:id="@+id/gridview_file" android:layout_width="match_parent" android:layout

安卓兼职framework和app工程师的博客 911

android tv gridview,Android TV开发经验总结---控件Gridview使用

前Android TV 开发的资料不是蛮多,经过一系列的搜索,目前比较适用的框架推荐冰雪情缘TV/Android-TV-Frame 项目地址:https://git.oschina.net/hailongqiu/AndroidTVWidget在我们TV开发中用到最多的可能就是网格和列表了,今天我们先讲讲GridView,有人就会想现在不都是在用recyclerview吗? 但是我告诉你,...

weixin_42505032的博客 2万+

Android控件之GridView用法实例分析

本文实例讲述了Android控件之GridView用法。分享给大家供大家参考。具体如下: GridView是一项显示二维的viewgroup,可滚动的网格。一般用来显示多张图片。 以下模拟九宫图的实现,当鼠标点击图片时会进行相应的跳转链接。 目录结构如下: main.xml布局文件,存放GridView控件 <?xml version=1.0 encoding=utf-8?> <!-- android:numColumns=auto_fit ,GridView的列数设置为自动 android:columnWidth=90dp,每列的宽度,也就是Item的宽度 android

安卓gridview控件的使用

但是由于后期配合项目整体UI的要求,框架不适合,那么又如何有放大选中的效果呢,我的思路是设置Item放大后的背景,先隐藏当选中的时候对View进行放大正好是背景的大小,这就需要我们自己计算Item的宽高了,给个我实现的案例。有的时候我们需要分页加载数据怎么办,我的思路是判断当前选中的Item的位置是否在最底下,如果是就进行网络请求,在页面的OnkeyDown事件中监听,其实将逻辑封装在自定义Gridview中然后暴露回调接口出来。

m0_72495985的博客 1246

ESP32连接OneNet云平台实现多设备联动控制完整示例

通过esp32连接onenet云平台,实现远程设备间的智能联动控制,利用MQTT协议完成数据通信,esp32连接onenet云平台后可高效稳定地上传与下发指令,提升物联网系统响应速度与自动化水平。

weixin_42360733的博客 547

触摸延时灯课程设计

Multisim源文件下载: 实验名称:­­­­­­­­­­­­­­­­­­­ 课程设计1:触摸延时灯仿真设计 设计要求: 利用单稳态触发器设计触控延时灯,要求利用触发波形的边沿模拟触控点实现触发,触发后3秒灯亮,灯可以亮的时间可在5-10秒之间可调。 设计思路: 利用集成单稳态触发器CD4098设计简易的触摸延时灯电路。应用CD4098可以实现脉冲延时,原理图如下。4脚未触发信号输入端,可通过比较器对触摸产生的信号进行比较后再产生触发信号,使触发准确度得以提高。...

m0_54240221的博客 1万+

Android TV Widget: 打造极致电视应用体验

Android TV Widget,一个专为Android电视、盒子及投影设备设计的开源控件库,采用Java语言编写。此项目由FrozenFreeFall发起,致力于简化电视应用的开发流程,提升用户体验。通过集合一系列定制化UI组件和实用工具,它成为了开发者在Android TV平台上的得力助手。 ## 核心功能 - **自定义适配器与视图**: 提供专门针对电视界面的标题栏adapter基础类

gitblog_01255的博客 644

Cox构建预测模型(5):如何用R语言绘制校准曲线(附全套代码)

这篇文献通过绘制两个模型的DCA曲线来评估模型的临床决策实际需求,一个是列线图模型,包括纳入列线图的全部变量,一个是TNM模型,只纳入TNM分期3个变量。A图是训练集1年、3年、5年患者的总生存期的DCA曲线;B图是训练集1年、3年、5年患者的总生存期的DCA曲线,红色线条代表列线图模型(包括构建模型的10个变量),黄色线条代表TNM模型(仅纳入TNM分期3个变量),两个模型对比,在绘制校准图之前,必须要完成数据的导入、拆分数据集的工作、预测因子的筛选,校准图的绘制是分别在训练集与验证集独立进行的。

qq_37610365的博客 1360

android tv gridview,Android TV,机顶盒Gridview 焦点

切换两个控件之间的焦点,TV、机顶盒用android自带的控件 例如listview或者gridview 是,因为需要适配手机等,所以控件某些方面(如每个控件的焦点,切换时的速度,位置等)是不会很匹配TV、机顶盒的.最好的方法是自己绘制一个gridview正常的GridView,然而item的控件就需要自定义了:MyImageViewimport android.annotation.Suppre...

weixin_42451850的博客 373

Visual Studio 6.0 镜像下载全指南:从企业版到中文版

本文提供Visual Studio 6.0企业版和中文版的镜像下载全指南,包括详细版本解析、已验证的下载链接及校验信息。针对现代系统的安装技巧和兼容性处理方案,帮助开发者高效获取并运行这一经典开发工具,特别适合维护遗留系统的专业人员。

weixin_33712987的博客 1014

解决创建conda环境时Solving environment: failed 和 ResolvePackageNotFound 的错误

环境配置文件是在别的机器上导出的,文件里的软件包是按照导出文件的机器配置的,因此导出的时候,把这些包的详细信息也导了出来,即第二个等号后面跟着的信息,当我们按照这个文件创建环境时,conda就会根据我们机器的配置信息,按照配置文件里包的详细信息,去找这个包,那当然找不到,结果发现“查无此包”,因此也就会报上面的错误。上面找到了问题的所在之处,解决起来就很简单了,只需要在配置文件 environment.yml 中将包的详细信息删除,也就是第二个等号后面的内容。然而升级超级慢不说,也没有解决我的问题。...

番茄炒蛋三分糖 4万+

android tv 控件大全,AndroidTvWidget-AndroidTV/盒子/投影仪控件

使用说明:https://git.oschina.net/hailongqiu/AndroidTVWidget/wikis/AndroidTVWidget-use-manual键盘使用说明:https://git.oschina.net/hailongqiu/AndroidTVWidget/wikis/Android-TV-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%...

weixin_30160357的博客 501

【嵌入式Linux】EC20模块多运营商自适应PPP拨号实战:从IMSI识别到网络配置

本文详细介绍了在嵌入式Linux系统中,如何基于EC20 4G模块实现多运营商自适应PPP拨号。通过解析SIM卡的IMSI识别运营商,并动态配置对应的APN和拨号参数,结合AT指令交互与健壮的pppd脚本,解决了设备跨地域部署时的网络自动连接问题,提升了物联网设备的部署效率和稳定性。

fox11的博客 902

安卓TV开发遇到的那些坑

最近公司需要开发一个TV的luancher,就是那种纯物理按键的遥控,没有触摸屏,现在说说我踩得那些坑。(其实布局和代码逻辑和正常的安卓应用差不多) 1.焦点 焦点 焦点,重要的事情说三遍,安卓TV由于没有触摸屏所以需要手动设置可以获取焦点的控件。 2.设置获取到状态也就是常用的select。 3.各种事件冲突。 4.按键事件 通过重写onKeyDown(),onKeyUp()方法中监听keyCode的值,来判断用户按下的是哪个键,比如OK键 其他特殊的键值,上下左右键的话,系统会自动处.

帅气的红烧肉的博客 2539

不用公网IP!用Ollama+Chatbox搭建家庭AI助手(内网穿透方案对比)

本文详细介绍了如何利用Ollama和Chatbox在家庭局域网中搭建本地AI助手,无需公网IP即可实现内网穿透。通过对比不同穿透方案(如Tailscale、FRP等),提供最优配置建议,帮助用户低成本部署隐私安全的家庭AI系统,适用于智能家居、儿童教育等多种场景。

weixin_26765287的博客 460

新政下的绿电直连项目经济性分析:模式创新与价值重构

随着全球气候治理与低碳转型进程不断加速,绿电直连作为新能源就近消纳的创新模式,正成为破解新能源消纳瓶颈、规避碳关税壁垒的核心路径。2025年9月,国家发展改革委、国家能源局发布《关于完善价格机制促进新能源发电就近消纳的通知》(1192号文),为绿电直连项目的经济性分析与效益测算提供了明确的政策依据。本文将基于新政框架,深入解析绿电直连项目的经济性影响因素、盈利模式与优化路径,并结合案例与量化模型,为项目投资决策提供系统参考。

getusushu的博客 140

Android-tv-widget 项目推荐

**Android-tv-widget** 是一个专为 Android TV、盒子及投影仪设计的开源控件库。该项目的主要编程语言是 Java,它提供了一系列用于构建 TV 应用的 UI 控件和框架。 ## 项目核心功能 1. **Leanback 框架**:类似于谷歌的 Leanback 框架,但更加简洁和方便,适合快速开发 TV 应用。 2. **键盘框架**:提供了一套完整的键盘控件,方便

gitblog_00313的博客 474

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

android tv 开发的列表条目在获得焦点时的背景效果

项目要做一个列表,给出的条目获得焦点时的图片是这样的,看这个图片,边框发光的效果范围超大,如果按正常的做法,要使条目中文字显示正常,就要把每个item的高度设为很高,这样显然不适合要求,让设计师将焦点图片的发光范围改小,效果也可能达不好之前设计的效果,这个设计师怎么就非要设置这们的效果呢 ?结果研究半天只能有下面这勉强可行方法 1 , 之前是要ListView实现的,现在改用GridVi

casun_li的专栏 795

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

安卓TV中Gridview或listview获取不到焦点

子item处理无法点击或者无法获取焦点。

aijiameng的博客 1025

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

AN GridView 横向分页,适合TV等有按键需求的android系统

关键分析:根据屏幕比例算出每一页放多少个Item

muxi@Achilles的专栏 1839
上一篇: Android TV开发经验总结---初识TV开发
下一篇: Android如何实现APP自动更新
Derbe
博客等级 码龄15年 27粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值