RecyclerView scrollToPosition not trigger scrollListener

前端 未结 8 2142
予麋鹿
予麋鹿 2021-02-01 03:35

I\'m using RecyclerView, with ScrollListener:

mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener()
{
        @Override
        public void onScr         


        
相关标签:
8条回答
  • 2021-02-01 04:12

    Please try with

    LinearLayoutManager.scrollToPositionWithOffset(int, int).
    

    LayoutManager.scrollToPosition() may not work well, but LinearLayoutManager.scrollToPositionWithOffset() will work. And similarlly GridLayoutManager as well.

    Or we have to write our custom way of implementation because RecyclerView doesn't know how LayoutManager scrolls the view.

        class CustomLayoutManager extends LinearLayoutManager{
             public void smoothScrollToPosition(RecyclerView recyclerView,
                    RecyclerView.State state, final int position) {
    
              LinearSmoothScroller smoothScroller = 
                        new LinearSmoothScroller(mContext) {
            //Override the methods and write your implementation as per your requirement 
           //one which controls the direction and another one calculate the speed per Pixel
            }
        }
    

    Sometimes this does the trick

        new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            yourList.scrollToPosition(position);
        }
    }, 200);
    
    0 讨论(0)
  • 2021-02-01 04:16
    int mFirst=0, mLast=0;
    
    recyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
        }
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            LinearLayoutManager llm = (LinearLayoutManager) recyclerview.getLayoutManager();
            mLast = llm.findLastCompletelyVisibleItemPosition();
            mFirst = llm.findFirstCompletelyVisibleItemPosition();
        }
    });
    
    imgRight.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            LinearLayoutManager llm = (LinearLayoutManager) recyclerview.getLayoutManager();
            llm.scrollToPositionWithOffset(mLast + 1, List.length());
        }
    });
    
    imgLeft.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            LinearLayoutManager llm = (LinearLayoutManager) recyclerview.getLayoutManager();
            llm.scrollToPositionWithOffset(mFirst - 1, List.length());
        }
    });
    
    0 讨论(0)
提交回复
热议问题