【问题标题】:Capture KeyEvent on RecyclerView Views在 RecyclerView 视图上捕获 KeyEvent
【发布时间】:2015-10-03 10:51:00
【问题描述】:

按照this 博客文章中的说明,我可以在垂直列表适配器上跟踪所选项目,但我无法通过按某个键单击或长按任何项目。

我已经创建了这个方法

public static boolean isConfirmButton(KeyEvent event){
    switch (event.getKeyCode()){
        case KeyEvent.KEYCODE_ENTER:
        case KeyEvent.KEYCODE_DPAD_CENTER:
        case KeyEvent.KEYCODE_BUTTON_A:
            return true;
        default:
            return false;
    }
}

拦截“确认”按钮,但哪里是收听KeyEvents 的正确位置?如何区分点击和长按?

【问题讨论】:

    标签: android android-recyclerview android-keypad


    【解决方案1】:

    我已经编辑了帖子中的代码,添加了常规和长按按钮:

    @Override
    public void onAttachedToRecyclerView(final RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    
        mRecyclerView = recyclerView;
    
        // Handle key up and key down and attempt to move selection
        recyclerView.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                RecyclerView.LayoutManager lm = recyclerView.getLayoutManager();
    
                // Return false if scrolled to the bounds and allow focus to move off the list
                if (event.getAction() == KeyEvent.ACTION_DOWN) {
                    if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
                        return tryMoveSelection(lm, 1);
                    } else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
                        return tryMoveSelection(lm, -1);
                    } else if(KeyEventUtils.isConfirmButton(event)){
                        View view = mRecyclerView.findViewHolderForAdapterPosition(mSelectedItem).itemView;
                        if((event.getFlags() & KeyEvent.FLAG_LONG_PRESS)==KeyEvent.FLAG_LONG_PRESS) {
                            view.performLongClick();
                        }
                        else{
                            view.performClick();
                        }
                        return true;
                    }
                }
    
                return false;
            }
        });
    }
    

    现在它可以正常工作了,我不知道这是否是最优雅的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 2013-06-20
      • 2013-01-19
      • 1970-01-01
      • 2018-03-29
      • 2016-01-20
      相关资源
      最近更新 更多