背景
在上一篇中,把我们基础的功能实现了,但是焦点乱跑,现在就一点一点把乱跑的焦点控制起来。
上一篇地址:https://www.sunofbeach.net/a/1474568710915194882
VerticalGridView焦点无法往上跳出
当我们进入了网格列表中,也就是文章列表中的时候,在第一排继续往上,我们的目标是聚焦到收藏按钮上面。
这里默认是无法跳出的。需要在VerticalGridView中打开一个限制。
app:focusOutFront="true"
允许跳出。增加之后我们看看效果。
问题解决。
第一次进入页面,分类获取成功后,默认显示第一个分类上面
也就是说,我们需要这样的效果。
现在默认进来是收藏聚焦,这不是我们需要的。
也就是,分类请求完成后,显示完成数据,第一个item聚焦
。
//这里没有做任何封装,先这么用着。够原生的了。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo06);
initView();
//获取数据
service.getCategoryList()
.enqueue(new Callback<BlogCategory>() {
@Override
public void onResponse(Call<BlogCategory> call, Response<BlogCategory> response) {
//分类获取成功,填充rv
mCategoryAdapter.setNewInstance(response.body().getData());
rvCategory.post(new Runnable() {
@Override
public void run() {
//让rv更新完后,我们再聚焦第一个item。
View childAt = rvCategory.getLayoutManager().getChildAt(0);
if (childAt != null) {
childAt.requestFocus();
}
}
});
}
@Override
public void onFailure(Call<BlogCategory> call, Throwable t) {
}
});
}
至于我们刚刚进来的时候是收藏聚焦的,这个可以先不显示,等数据完成了才显示收藏也行。这里就不处理了。
上面的代码解决第一次进来聚焦第一个item的问题。
焦点根据业务分区
1:我们把焦点分3个区,第一个分类列表 2:第二个收藏 3:第三个是网格列表
分区之后,我们每个区拿到焦点了就更新分区记录。
这样在我们按键切换的时候,就需要判断下一步的焦点要去哪里了。
第一个场景:进来的时候,我们在第一个item,按左:
需要显示网格第一个item。
在整个act按键分发
的时候,我们做按下按键,和方向左的拦截。
定义了3个焦点区。
/**
* 默认分类
*/
private static final int focus_type = 1;
/**
* 收藏
*/
private static final int focus_collection = 2;
/**
* 网格
*/
private static final int focus_grid = 3;
private int currentFocusType = focus_type;
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
//当按键按下的时候。
int keyCode = event.getKeyCode();
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_LEFT:
//按键的值,方向键左的时候。我们需要把分类的切换到列表第一个item中。
//而且条件是,焦点在分类中。
switch (currentFocusType) {
case focus_type:
//当前在分类中,按左键,需要聚焦到网格的第一个item中。
Log.i(TAG, "dispatchKeyEvent: 切换到左边网格第一个");
//这个api在模拟器上面居然不可以,我醉了。那就用原始方式吧。
//vgv.setSelectedPosition(0);
vgv.getChildAt(0).requestFocus();
//消费这次聚焦,代表我们自己处理,不给系统处理。
currentFocusType = focus_grid;
return true;
case focus_collection:
break;
}
break;
}
}
return super.dispatchKeyEvent(event);
}
看看效果图。
每次切换分类后,往左边切换焦点,必须跑网格第一个item中。这个需求我们实现了。
今天就分享到这里。
后面还有问题,继续解决。
比如:分类聚焦到具体列表上面后,往右边聚焦,他会跑到就近的那个分类中,并不会回到原来过来的分类中。
项目地址 https://gitee.com/dong_rong/android-tv-sample
具体代码可以看Demo06Activity。
每次修改我都会复制一份代码出来修改,如果看之前的效果,直接切换act打开就行了。