Android TV开发 焦点返回ListView时, 返回到离开时的位置
来源:互联网 发布:js文件在线格式化 编辑:程序博客网 时间:2024/06/06 09:45
最近在开发一个ICNTV海外 TV端的项目,遇到一个小需求。
具体功能描述: 最左边布局一个ListView 用于显示分类列表,右侧布局一个gridview 用于展示视频列表信息。 当从listview 切换到gridview时再返回时,会选择离当前焦点位置最近的Item 作为下一个焦点的捕获点。onFocusChanged源码,
final ListAdapter adapter = mAdapter;
int closetChildIndex = -1;
int closestChildTop = 0;
if (adapter != null && gainFocus && previouslyFocusedRect != null) {
previouslyFocusedRect.offset(mScrollX, mScrollY);
// Don't cache the result of getChildCount or mFirstPosition here,
// it could change in layoutChildren.
if (adapter.getCount() < getChildCount() + mFirstPosition) {
mLayoutMode = LAYOUT_NORMAL;
layoutChildren();
}
// figure out which item should be selected based on previously
// focused rect
Rect otherRect = mTempRect;
int minDistance = Integer.MAX_VALUE;
final int childCount = getChildCount();
final int firstPosition = mFirstPosition;
for (int i = 0; i < childCount; i++) {
// only consider selectable views
if (!adapter.isEnabled(firstPosition + i)) {
continue;
}
View other = getChildAt(i);
other.getDrawingRect(otherRect);
offsetDescendantRectToMyCoords(other, otherRect);
//遍历listview的child,并获取direction方向的距离
int distance = getDistance(previouslyFocusedRect, otherRect, direction);
if (distance < minDistance) {
minDistance = distance;
closetChildIndex = i;
closestChildTop = other.getTop();
}
}
}
if (closetChildIndex >= 0) {
setSelectionFromTop(closetChildIndex + mFirstPosition, closestChildTop);
} else {
requestLayout();
}
此时,需要重写onFocusChanged,记录焦点改变时的位置,当listview获取焦点时,调用listview的setSelectionFromTop方法。如果调用setSelection会出现滑动效果。
protected void onFocusChanged(boolean gainFocus, int direction,Rect previouslyFocusedRect) {
int lastSelectItem = getSelectedItemPosition();
super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
if (gainFocus) {
//获取焦点离开前的selection位置聚listview顶端位置,通过setSelectionFromTop方法,避免出现滑动效果。
View other = getChildAt(lastSelectItem);
int top = (other== null) ? 0 : other.getTop();
setSelectionFromTop(lastSelectItem, top);
}
}
- Android TV开发 焦点返回ListView时, 返回到离开时的位置
- 使用sessionStorage实现返回上一页直接到离开时的位置
- Android TV 开发-listview(GridView)使用键盘获取焦点时,选中上次失去焦点时的item,而不是就近的item
- Android TV开发:设置全局焦点框及listview中item的焦点获取
- listview控件当点击进入一个item后返回,仍然返回到点击item时listview所定位到的位置
- RecyclerView重新得到焦点返回上次失去焦点的位置
- seekbar拖动时返回到拖动开始位置的原因
- android tv 开发的列表条目在获得焦点时的背景效果
- android tv 焦点居中自定义listview控件的实现
- Android TV开发 焦点控制
- Android TV开发 焦点框
- android Tv盒子开发 焦点
- Android TV ListView列表焦点保留?ListView如何获取焦点?
- android TextView刷新时ImageView返回初始位置的问题
- Android TV listView焦点平滑移动
- android TV开发屏蔽home键,返回键
- js:返回到页面时滚动到上次浏览位置
- android开发位置应用getBestProvider返回为空的问题
- 属于菜鸟的一些笔记
- 神经网络第一部分:背景Neural Networks, Part 1: Background
- 数据切分——MySql表分区概述
- asp.net 树TreeView 默认展开二级菜单
- 通讯录所有字段
- Android TV开发 焦点返回ListView时, 返回到离开时的位置
- javascript设置了location.href不跳转问题
- html总结
- uva253
- 数据切分——Atlas读写分离Mysql集群的搭建
- Harbor Registry项目源代码结构解析
- 安卓网站收集
- Bshare分享
- SQL Server简洁分页代码