簡體   English   中英

滾動停止時的回收器視圖

[英]Recycler View on Scroll Stop

基本上我希望我的 recyclerview 自動滾動到 position,其中項目沒有顯示一半。 就像googleplay中的那個。

我寫了一段代碼

public void scrollToVisible(){
    int firstVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
    View view = recyclerView.getLayoutManager().getChildAt(0);
    if (firstVisibleItemPosition > 0 && view != null) {
        int offsetTop = view.getTop();
        if (firstVisibleItemPosition - 1 >= 0 && adapter.getItemCount() > 0) {
            ((LinearLayoutManager) recyclerView.getLayoutManager()).scrollToPositionWithOffset(firstVisibleItemPosition - 1, offsetTop);
        }
    }
}

接下來問題來了。 我不知道把這段代碼放在哪里。 當 recyclerview 停止滾動時,我有一個模糊的想法,但我已經搜索了很長一段時間,但我找不到這樣的方法。 當我把它放在 onScroll 上時,出現了一些意想不到的行為

您可以創建一個CustomRecyclerView擴展RecyclerView

public class CustomRecyclerView extends RecyclerView {
@Override
public void onScrollStateChanged(int state) {
    super.onScrollStateChanged(state);

    // check if scrolling has stopped
    if (state == SCROLL_STATE_IDLE) {
         LinearLayoutManager linearLayoutManager = (LinearLayoutManager) getLayoutManager();
         // use code here
    }
}

如果對某人有幫助:

    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

                    super.onScrolled(recyclerView, dx, dy);

                        Log.d("y value",String.valueOf(dy));
                    if (dy > 0) {                       

                       //scrolling up

                    } else {
// Scrolling down
                    }
                }

                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);

                    if (newState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) {
                        // Do something
                        Log.e("SCROLL_STATE_FLING","SCROLL_STATE_FLING");
                    } else if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
                        Log.e("SCROLLTOUCH_SCROLL","SCROLL_STATE_TOUCH_SCROLL");
                        //slideUp(party_view);
                        // Do something
                    } else if (newState==AbsListView.OnScrollListener.SCROLL_STATE_IDLE){
                        // Do something
                        //slideDown(party_view);
                        Log.e("SCROLL_STATE_IDLE","SCROLL_STATE_IDLE");
                    }
                }
            });

UI 同步的完整示例

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);

            Handler handler = new Handler(getMainLooper());

            if (newState == 0) {
                handler.removeCallbacks(MainActivity.this::hideFab);
                handler.postDelayed(MainActivity.this::showFab, 400);
            } else {
                handler.removeCallbacks(MainActivity.this::showFab);
                handler.postDelayed(MainActivity.this::hideFab, 100);
            }

        }
    });


private void hideFab() {
    addFile.hide();
    addText.hide();
    camera.hide();
}



private void showFab() {
    addFile.show();
    addText.show();
    camera.show();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM