1

Следуя указаниям на this блоге, я могу отслеживать выбранный элемент в вертикальном списке Адаптер, но я не могу щелкнуть или долго нажимать на любой элемент, нажав клавишу.Capture KeyEvent on RecyclerView Views

Я создал этот метод

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; 
    } 
} 

перехватывать кнопки «Confirm», но там, где это правильное место для прослушивания KeyEvents? Как сделать различие между кликом и длинным кликом?

ответ

3

Я редактировал код с поста, добавив регулярные и длительные нажатия кнопок:

@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; 
     } 
    }); 
} 

Сейчас он работает правильно, я не знаю, если это самый элегантный способ.