Android使listview(GridView) 获取焦点时,选中上次失去焦点时的item,而不是就近的item
2016-03-11 11:14
696 查看
在电视上开发android应用时,经常要做有二级菜单的应用,例如:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/0548cd1243c96c527996dbd817f9bce1)
但当我们按左键的时候,左边listview的最近的item会被选中,即如下效果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/bc9a9e85feb06c394f5702ec19708fa4)
但是在电视上开发应用的时候,我们希望是上一次被选中的item重新被选中,即希望是“日期和时间”被重新选中。
为了实现这个效果,我之前上网查过很多博客都没找到答案,也用过多个投机取巧的方法,这一次我通过查看源代码,发现造成这个问题的原因是ListView的onFocusChanged方法会寻找最近的item,然后选中他,于是解决这个问题的根治办法,就是重写ListView的onFocusChanged方法,但不需写太多代码,该ListView获取焦点时会选中 上次失去焦点时选中的item。下面是该ListView的源代码,很简短,不多解释了。
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
public class MemListView extends ListView {
public MemListView(Context context) {
super(context);
}
public MemListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MemListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
int lastSelectItem = getSelectedItemPosition();
super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
if (gainFocus) {
setSelection(lastSelectItem);
}
}
}
但当我们按左键的时候,左边listview的最近的item会被选中,即如下效果:
但是在电视上开发应用的时候,我们希望是上一次被选中的item重新被选中,即希望是“日期和时间”被重新选中。
为了实现这个效果,我之前上网查过很多博客都没找到答案,也用过多个投机取巧的方法,这一次我通过查看源代码,发现造成这个问题的原因是ListView的onFocusChanged方法会寻找最近的item,然后选中他,于是解决这个问题的根治办法,就是重写ListView的onFocusChanged方法,但不需写太多代码,该ListView获取焦点时会选中 上次失去焦点时选中的item。下面是该ListView的源代码,很简短,不多解释了。
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
public class MemListView extends ListView {
public MemListView(Context context) {
super(context);
}
public MemListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MemListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
int lastSelectItem = getSelectedItemPosition();
super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
if (gainFocus) {
setSelection(lastSelectItem);
}
}
}
相关文章推荐
- Android具有system权限为什么不可以访问SDcard
- Android逆向---Fiddler简易使用教程之配置环境(1)
- 实现ListView的弹性效果,下拉隐藏ToolBar(ActionBar),上拉显示ToolBar
- Android-BaseLine框架初识之如何使用(二)
- GridView & ListView (Android盒子开发)
- android系统源码查看地址
- 实例介绍 Java(android) 回调函数使用方法
- 前言:一步一步开发安卓应用
- android不用root删除系统apk
- android textview改变部分文字的颜色和string.xml中文字的替换
- android-设置状态栏与标题栏背景
- android 后台service开机自启动
- Android实现通讯录效果――获取手机号码和姓名
- Android自定义圆形菜单
- Android 自定义RecyclerView 实现真正的Gallery效果
- Android error:No CPU/ABI system image available for this target
- 转:Android线程的创建与销毁
- Android消息机制之 Looper、Handler、Message的关系和运行
- Android实现开机自动运行程序
- layout_marginLeft和layout_marginStart