Android TV開發NO.2--RecyclerView 焦點控制
阿新 • • 發佈:2019-01-12
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在焦點控制的時候,不會自動換行,我們可以設定焦點強制換行
栗子demo
android TV使用 RecyclerView ,用焦點控制item 首先在item中的xml中,的最外層新增 android:focusable="true",此句是為RecyclerView 的item新增焦點屬性,新增完屬性後,在RecyclerView 的 RecyclerView.Adapter中onBindViewHolder方法中新增:此view是,設定過 android:focusable="true"的view View.setOnFocusChangeListener(){
由於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