SideBarView icon indicating copy to clipboard operation
SideBarView copied to clipboard

解决字母栏触摸滑动和RecyclerView滚动冲突

Open xiaolunan opened this issue 4 years ago • 1 comments

问题说明:手指触摸滑动使RecyclerView滚动,RecyclerView滚动触发onitemScrollUpdateText方法中的invalidate();,会导致两个invalidate();方法通知出发,反复刷新,使字母导航选中字母跳动。 解决:增加一个标记,在触摸字母栏的时候,RecyclerView滚动调用invalidate();方法 //标记是否是按住 1. private boolean isDown = false; 2.

@Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                int index = (int) (event.getY() / getHeight() * mList.length);
                if (index >= 0 && index < mList.length) {
                    if (mClickListener != null) {
                        mClickListener.onSideBarScrollUpdateItem(mList[index]);
                    }
                    mSelectIndex = index;
                    invalidate();
                    //改变标记状态
                    isDown = true;
                }
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                if (mClickListener != null) {
                    mClickListener.onSideBarScrollEndHideText();
                    //改变标记状态
                    isDown = false;
                }
                break;
        }
        return true;
    }```

3.
`public void onitemScrollUpdateText(String word) {
        //手指没触摸才调用
        if (!isDown) {
            for (int i = 0; i < mList.length; i++) {
                if (mList[i].equals(word) && mSelectIndex != i) {
                    mSelectIndex = i;
                    invalidate();
                }
            }
        }
    }`

xiaolunan avatar Aug 10 '21 01:08 xiaolunan

单个字母也会多次刷新回调,将:

if (index >= 0 && index < mList.length)

换成:

if (index >= 0 && index < mList.length && mSelectIndex != index)

princekin-f avatar Sep 01 '22 06:09 princekin-f

已更 1.0.1

lzjin avatar Mar 30 '23 09:03 lzjin