短影片app原始碼,日常開發之RecycleView滑動

zhibo系統開發發表於2023-09-26

短影片app原始碼,日常開發之RecycleView滑動

一、使用recyclerview.scrollToPosition(index)滑動佈局,結果定位不準確

解決辦法:

//使用LayoutManager滑動位置並設定offset為0,可以保證滑動的位置正確
mLayoutManager.scrollToPositionWithOffset(index, 0);


二、區分手動滑動和程式碼滑動

/**
 * @author : zhn
 * @date : 2022/7/1 18:02
 * description :滑動監聽,判斷是不是使用者自己手動滑動
 */
public class ScrollListenerRecyclerView extends RecyclerView {
 
    //使用者觸發的滑動含filling狀態
    private boolean userScroll;
 
    //使用者拖動
    private boolean userTouch;
 
    public ScrollListenerRecyclerView(@NonNull Context context) {
        super(context);
    }
 
    public ScrollListenerRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
 
    public ScrollListenerRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
 
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (mListener != null) {
            mListener.onScrollChanged(userScroll, l, t, oldl, oldt);
        }
    }
 
    @Override
    public void onScrollStateChanged(int state) {
        super.onScrollStateChanged(state);
        if (state == SCROLL_STATE_IDLE && !userTouch) {
            userScroll = false;
        }
    }
 
    @Override
    public boolean onTouchEvent(MotionEvent e) {
        if (e.getAction() == MotionEvent.ACTION_MOVE) {
            userTouch = true;
            userScroll = true;
        } else if (e.getAction() == MotionEvent.ACTION_UP) {
            userTouch = false;
        }
        return super.onTouchEvent(e);
    }
 
    public interface ScrollChangeListener {
 
        void onScrollChanged(boolean fromUser, int l, int t, int oldl, int oldt);
    }
 
    private ScrollChangeListener mListener;
 
    public void setListener(ScrollChangeListener listener) {
        mListener = listener;
    }
}


用法:

mBinding.rlvCourseDetail.setListener(new ScrollListenerRecyclerView.ScrollChangeListener() {
    @Override
    public void onScrollChanged(boolean fromUser, int l, int t, int oldl, int oldt) {
        if (fromUser) {
            scrollSwitchTab();
        }
    }
});


 以上就是短影片app原始碼,日常開發之RecycleView滑動, 更多內容歡迎關注之後的文章


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69978258/viewspace-2985998/,如需轉載,請註明出處,否則將追究法律責任。

相關文章