安卓gridview控件的使用

前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? ? ?选中事件.

    //选中事件

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开发中需要判断是否焦点在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

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) { //

if (getGridSelectionState() == BOTTOM && isHaveMore) { //翻页

//TODO:加载数据

return true;

}

}

break;

}

return false;

}

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

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

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

先看看xml

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="@dimen/px449"

android:layout_height="@dimen/px323"

android:orientation="vertical">

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">

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"/>

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

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 的放大效果,大家可以去搜索下看看

安卓gridview控件的使用相关推荐

  1. ASP.NET2.0中用Gridview控件操作数据

    在ASP.NET 2.0中,加入了许多新的功能和控件,相比asp.net 1.0/1.1,在各方面都有了很大的提高.其中,在数据控件方面,增加了不少控件,其中的Gridview控件功能十分强大.在本文 ...

  2. GridView控件修改、删除示例(修改含有DropDownList控件)

    GridView控件修改.删除例子,修改时含有DropDownList控件. 示例运行效果图: GridViewUp.aspx文件代码: <%@ Page Language="C#&q ...

  3. 扩展GridView控件(7) - 行的指定复选框选中时改变行的样式

    GridView既强大又好用.为了让它更强大.更好用,我们来写一个继承自GridView的控件. [索引页] [×××] 扩展GridView控件(7) - 行的指定复选框选中时改变行的样式 作者:w ...

  4. 自定义的GridView控件源代码

    简单地扩展GridView控件的功能.扩展的功能有:当前页/共几页,首页  上一页  下一页  末页  go[]ok 而且还能把gridview导入到excel中. Code   1namespace ...

  5. 单击GridView控件,高亮单击所在的记录行

    看过下面博文的网友,也许都会觉得有点遗憾,就是很难知道自己点击的是哪一记录行. http://www.cnblogs.com/insus/p/3211017.html 针对这个问题Insus.NET再 ...

  6. GridView控件添加鼠标移入移出时背景行变色的效果

    在GridView控件的RowDataBound事件中添加以下代码: protected void gvOperateLog_RowDataBound(object sender, GridViewR ...

  7. ASP.NET 2.0 – 如何巢状化GridView控件

    图表 1 最近听到有许多朋友询问如何以巢状方式使用GridView控件,也就是说在GridView控件中再内含另外一个GridView控件.我们最近在撰写ASP.NET AJAX一书时,刚好撰写了一个 ...

  8. asp.net 中GridView控件实现全选及反选的功能

    大家都知道邮箱里面有全部删除邮件的复选按钮,其实还是比较简单哈! 废话嘛!就不说那么多了,我先给大家讲哈功能的实现. 首先,拖一个GridView控件和SqlDataSource控件,配置数据源. 然 ...

  9. GRIDVIEW控件删除数据前如何给予客户端提示

    在.net 2.0 中,GRIDVIEW控件有个GridView.RowDeleting 事件 ,我想在客户端删除数据前给予提示,弹出比如"确定删除吗?"的提示,并且根据用户的选择 ...

  10. 在 GridView 控件中添加一列复选框51

    简介 在前面的教程中 , 我们学习了如何为 GridView 控件添加一列 单选 按钮来选择一个特定的记录.当用户被限制最多只能从网格中选中一项时,一列单选按钮是一个非常恰当的用户界面.然而,有时我们 ...

最新文章

  1. 测试与封装5.1.5.2
  2. Silverlight C# 游戏开发:Flyer04让我们一起来摇摆吧
  3. Medusa(美杜莎)和Hydra(九头蛇)快速入门手册:01
  4. docker+kibana+filebeat的安装
  5. Oracle全库导入表报错 ORA-39126
  6. Appium1.9 之 Chromedriver安装方式
  7. Asp.Net中Cache操作类
  8. 降维--PCA学习笔记
  9. dubbo分布式事务解决方案_阿里架构师谈:高并发+分布式+秒杀+微服务+性能优化...
  10. python对数据相似度分析算法库_基于多维相似度的大数据检测推荐算法系统
  11. 5G网络中TNL和RNL的理解
  12. 【相机标定与三维重建原理及实现】学习笔记2——标定的算法与方法
  13. 植物大战僵尸无尽版游泳池优秀阵容推荐(一)
  14. 关于NdFeB样品的测量阶段总结
  15. 论文笔记:BahdanauAttention和LuongAttention(注意力机制详解)
  16. Shodan完全手册部分翻译(1)
  17. 天使与海豚的爱情故事
  18. 这可能是目前最方便的网站中英文切换(理论支持所有语言)
  19. Java 并发编程 常见面试总结
  20. 详细解析赋值、浅拷贝和深拷贝的区别

热门文章

  1. matlab怎么表示x的平方,用matlab算多项式x平方
  2. 人工智能能写剧本了 还被拍成了9分钟的短片
  3. 学习笔记4--自动驾驶汽车感知系统
  4. The connection property 'zeroDateTimeBehavior' only accepts values of the form: 'exception', 'round'
  5. 没看到能打的,遍历目录并读取目录下的文件列表。(C语言,SDK)
  6. 简单选择排序(Eternallyc)
  7. 【web攻防】CVE-2020-10487 tomcat 文件包含漏洞 docker 复现学习
  8. alpha对冲(股票+期货)
  9. 《期权、期货及其他衍生产品》读书笔记(第七章:互换)
  10. QQ空间抢车位刷钱方法汇总