Android  RecyclerView 本身的实现是不支持按键事件触发滚动或者翻页的,这在手机上没什么问题,几乎场景都是直接手指拖动 拉出新的内容,然而在一些无法使用触摸的Android设备上,几乎都是由按键事件触发内容更新,如Android TV 电视 等大屏设备上。而RecyclerView 本身在Android系统上使用是很常见的,但是本身又不支持按键翻页, 以下是解决方法。

1,重写按键事件接收方法:判断上下翻页按键。

 public class MyRecyclerView extends RecyclerView {

     @Override
     public boolean dispatchKeyEvent(android.view.KeyEvent event) {
         super.dispatchKeyEvent(event);
         if(event.getAction() == android.view.KeyEvent.ACTION_UP)
         return false;

         View item  = getChildAt(0);
         if(item == null) return false;
         int y0 = item.getBottom();
         item = getChildAt(getChildCount() -1);
         int ye = item.getBottom();
         int dy = ye-y0;
         Log.e(TAG, "dispatchKeyEvent dy = ye -y0 : dy = "+ye+"- "+y0 + " = "+dy);
         if(event.getKeyCode() == android.view.KeyEvent.KEYCODE_PAGE_DOWN){
             scrollBy(0, dy);
         } else if(event.getKeyCode() == android.view.KeyEvent.KEYCODE_PAGE_UP){
             scrollBy(0, -dy);
         }
         return false;
     }

核心思路:RecyclerView 本身是用于展示列表的,翻页就是滚动到下一页列表,至于每次滚动多长距离?自然就是当前列表中展示的最后一条item 相对于父view的距离de  (e : end),减去第一条item 相对于父view的距离d0, dy=de-d0. ,正向滚动,dy 为正数,反向滚动dy为负数。

关于翻页后的焦点问题;

监听 RecyclerView.OnScrollListener 

在 public void onScrolled(RecyclerView view, int dx, int dy) 

方法里:

获取翻页后的第一个view并申请焦点即可: 

getChildAt(0).requestFocus();

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐