基本学 Android 的都会遇到这个问题吧——“Android 的 ListView 如何设置默认焦点?”
在网上找到了很多方法都行不通:
1.setSelection(0)
mListView.setSelection(0);
这个是最大众的,大家都知道的方法,可是在初始化的时候并不管用。
2.异步 setSelection(0)
mListView.post(new Runnable() {
@Override
public void run() {
mListView.setSelection(0);
}
});
解释说因为 setAdapter() 后刷新ListView是异步的,必须在ListView显示出来后再去进行设置默认焦点。
好有道理,然而并不起作用。
3.setChoiceMode(List.CHOICE_MDE_SINGLE) + setItemChecked(0,true);(原先这个方法叫setItemSelected(x, x))
mListView.setChoiceMode(List.CHOICE_MDE_SINGLE);
mListView.setItemChecked(0,true);
并没有起作用。
百度了一下,其实这个是设置 ListView 的单选/多选模式,还有如下方法:
listview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);//开启多选模式
listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);//开启单选模式
listview.setChoiceMode(ListView.CHOICE_MODE_NONE);//默认模式
listview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);//没用过,不知道用来干嘛的
而它用listview.setItemChecked(position, boolean);来设置某行的状态
4.自定义 Adapter 。
在自定义 Adapter 里加一个属性curPosition,用来记录当前选中的位置是哪个(默认是0),然后在getView函数里面进行判断,如果position == curPosition,就设置当前 item 为焦点选中状态(比如设置背景为 focus_bg),否则,设置为焦点未选中状态(比如设置背景为 normal_bg)。
这样做表面上是达到了我要的效果,但实际上,只是改变了显示的样子,内在其实该 item 还是没有焦点的。
因为我做的项目

本文探讨了在Android中如何为RecyclerView设置默认焦点,尤其是在TV端使用时的问题。尝试了多种方法如setSelection、自定义Adapter等无效后,通过深入源码发现可以通过反射修改mNextSelectedPosition属性来实现。结合自定义Adapter记录当前选中位置,解决了焦点显示和实际状态不一致的问题。更新:在反射设置前先让ListView获取焦点,可进一步改善效果。
最低0.47元/天 解锁文章
3368

被折叠的 条评论
为什么被折叠?



