安卓gridview控件的使用
安卓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控件的使用相关推荐
- ASP.NET2.0中用Gridview控件操作数据
在ASP.NET 2.0中,加入了许多新的功能和控件,相比asp.net 1.0/1.1,在各方面都有了很大的提高.其中,在数据控件方面,增加了不少控件,其中的Gridview控件功能十分强大.在本文 ...
- GridView控件修改、删除示例(修改含有DropDownList控件)
GridView控件修改.删除例子,修改时含有DropDownList控件. 示例运行效果图: GridViewUp.aspx文件代码: <%@ Page Language="C#&q ...
- 扩展GridView控件(7) - 行的指定复选框选中时改变行的样式
GridView既强大又好用.为了让它更强大.更好用,我们来写一个继承自GridView的控件. [索引页] [×××] 扩展GridView控件(7) - 行的指定复选框选中时改变行的样式 作者:w ...
- 自定义的GridView控件源代码
简单地扩展GridView控件的功能.扩展的功能有:当前页/共几页,首页 上一页 下一页 末页 go[]ok 而且还能把gridview导入到excel中. Code 1namespace ...
- 单击GridView控件,高亮单击所在的记录行
看过下面博文的网友,也许都会觉得有点遗憾,就是很难知道自己点击的是哪一记录行. http://www.cnblogs.com/insus/p/3211017.html 针对这个问题Insus.NET再 ...
- GridView控件添加鼠标移入移出时背景行变色的效果
在GridView控件的RowDataBound事件中添加以下代码: protected void gvOperateLog_RowDataBound(object sender, GridViewR ...
- ASP.NET 2.0 – 如何巢状化GridView控件
图表 1 最近听到有许多朋友询问如何以巢状方式使用GridView控件,也就是说在GridView控件中再内含另外一个GridView控件.我们最近在撰写ASP.NET AJAX一书时,刚好撰写了一个 ...
- asp.net 中GridView控件实现全选及反选的功能
大家都知道邮箱里面有全部删除邮件的复选按钮,其实还是比较简单哈! 废话嘛!就不说那么多了,我先给大家讲哈功能的实现. 首先,拖一个GridView控件和SqlDataSource控件,配置数据源. 然 ...
- GRIDVIEW控件删除数据前如何给予客户端提示
在.net 2.0 中,GRIDVIEW控件有个GridView.RowDeleting 事件 ,我想在客户端删除数据前给予提示,弹出比如"确定删除吗?"的提示,并且根据用户的选择 ...
- 在 GridView 控件中添加一列复选框51
简介 在前面的教程中 , 我们学习了如何为 GridView 控件添加一列 单选 按钮来选择一个特定的记录.当用户被限制最多只能从网格中选中一项时,一列单选按钮是一个非常恰当的用户界面.然而,有时我们 ...
最新文章
- 测试与封装5.1.5.2
- Silverlight C# 游戏开发:Flyer04让我们一起来摇摆吧
- Medusa(美杜莎)和Hydra(九头蛇)快速入门手册:01
- docker+kibana+filebeat的安装
- Oracle全库导入表报错 ORA-39126
- Appium1.9 之 Chromedriver安装方式
- Asp.Net中Cache操作类
- 降维--PCA学习笔记
- dubbo分布式事务解决方案_阿里架构师谈:高并发+分布式+秒杀+微服务+性能优化...
- python对数据相似度分析算法库_基于多维相似度的大数据检测推荐算法系统
- 5G网络中TNL和RNL的理解
- 【相机标定与三维重建原理及实现】学习笔记2——标定的算法与方法
- 植物大战僵尸无尽版游泳池优秀阵容推荐(一)
- 关于NdFeB样品的测量阶段总结
- 论文笔记:BahdanauAttention和LuongAttention(注意力机制详解)
- Shodan完全手册部分翻译(1)
- 天使与海豚的爱情故事
- 这可能是目前最方便的网站中英文切换(理论支持所有语言)
- Java 并发编程 常见面试总结
- 详细解析赋值、浅拷贝和深拷贝的区别
热门文章
- matlab怎么表示x的平方,用matlab算多项式x平方
- 人工智能能写剧本了 还被拍成了9分钟的短片
- 学习笔记4--自动驾驶汽车感知系统
- The connection property 'zeroDateTimeBehavior' only accepts values of the form: 'exception', 'round'
- 没看到能打的,遍历目录并读取目录下的文件列表。(C语言,SDK)
- 简单选择排序(Eternallyc)
- 【web攻防】CVE-2020-10487 tomcat 文件包含漏洞 docker 复现学习
- alpha对冲(股票+期货)
- 《期权、期货及其他衍生产品》读书笔记(第七章:互换)
- QQ空间抢车位刷钱方法汇总