1. 程式人生 > >Android TV開發NO.2--RecyclerView 焦點控制

Android TV開發NO.2--RecyclerView 焦點控制

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