4

I'm working on an AndroidTV app, using the Leanback library.

I've got a few HorizontalGridView (which is an extension of RecyclerView) working correctly, however, scrolling through them by pressing and holding right|left button makes it scroll incredibly fast, too fast!

How can I slow down the speed at which it scrolls by leaving the button pressed?

Francisco Noriega
  • 13,725
  • 11
  • 47
  • 72

3 Answers3

3

Do not listen your key event for some milli-time in your activity.

 @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        long current = System.currentTimeMillis();
        boolean res = false;
        if (current - mLastKeyDownTime < 300) {
            res = true;
        } else {
            res = super.onKeyDown(keyCode, event);
            mLastKeyDownTime = current;
        }
        return res;
    }
A_rmas
  • 784
  • 2
  • 10
  • 26
0

Shorter answer in Kotlin.

override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
    val current = System.currentTimeMillis()
    if (current - lastKeyDownTime > 100){
        lastKeyDownTime = current
        return super.onKeyDown(keyCode, event)
    }
    return true
}
0

Override ListRowPresenter initializeRowViewHolder method and set the setOnKeyInterceptListener to the grid view and consume the keys events until Recyclerview scroll state reaches to RecyclerView.SCROLL_STATE_IDLE, this will reduce the scroll speed and focus the next item only after the scroll is stopped. The scroll behaviors would be like Youtube Android TV App.

object : ListRowPresenter() {
        protected override fun initializeRowViewHolder(holder: com.mxtech.mx_leanback.widget.RowPresenter.ViewHolder) {
           
            holder.gridView.setOnKeyInterceptListener(object : OnKeyInterceptListener{
            override fun onInterceptKeyEvent(event: KeyEvent?): Boolean {
                val keyCode = event!!.keyCode
                val actionType = event.action
                if (actionType == KeyEvent.ACTION_DOWN) {
                    if (holder.gridView.scrollState != RecyclerView.SCROLL_STATE_IDLE ) {
                        if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT || keyCode == KeyEvent.KEYCODE_DPAD_UP || keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
                            return true
                        }
                    }
                }
                return false
            }
        })

        override fun isUsingDefaultListSelectEffect(): Boolean {
            return super.isUsingDefaultListSelectEffect()
        }
    }