Android TV中使用RecyclerView 焦点自动换行
android TV使用 RecyclerView ,用焦点控制item
首先在item中的xml中,的最外层添加 android:focusable="true",此句是为RecyclerView 的item添加焦点属性,添加完属性后,在RecyclerView 的 RecyclerView.Adapter中onBindViewHolder方法中添加:此view是,设置过 android:focusable="true"的view
View.setOnFocusChangeListener(){
public
void
onFocus(
boolean
Focus){
if
( Focus ){
View.setBackground(R.color.green);
// View 获焦时,View 改变获取焦点背景, View也改变失去焦点背景
}
else
{
View.setBackground(R.color.
while
);
// View 获焦时, View 改变失去焦点背景 , View也改变获取焦点背景
}
}
就可以实现对RecyclerView 的监听了;
由于RecyclerView 的item在焦点控制的时候,不会自动换行,我们可以设置焦点强制换行
如:
boolean mRgiht = false;//判断按的是否是右按键
boolean mLeft = false;//判断按的是否是左按键
View.setOnKeyListener(new View.OnKeyListener() {//监听按键
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (mRgiht && (position + 1) % 6 == 0) {//6代表每行显示六个
//判断显示的FirstVisibleItemPosition
int firstVisibleItems = ((GridLayoutManager) RecyclerView .getLayoutManager()).findFirstVisibleItemPosition();
if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
if (mData.size() == position + 1) {
return true;
}
View view = rvCurrency.getChildAt(position + 1 - firstVisibleItems);
if (view != null) {
view.requestFocus();//设置焦点选中
} else {
RecyclerView .smoothScrollToPosition(position + 1);//设置第几个item可见
}
return true;
}
} else mRgiht = (position + 1) % 6 == 0;
if (position + 1 == mData.size()) {
if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
return true;
}
}
if (mLeft && (position) % 6 == 0) {
if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
if (position == 0) {
return true;
}
int firstVisibleItems = ((GridLayoutManager) rvCurrency.getLayoutManager()).findFirstVisibleItemPosition();
View view = rvCurrency.getChildAt(position - firstVisibleItems - 1);
if (view != null) {
view.requestFocus();
} else {
rvCurrency.smoothScrollToPosition(position - 1);
}
return true;
}
} else mLeft = (position) % 6 == 0;
return false;
}
});
欢迎留言,共同探讨,谢谢!
栗子demo