本文主要針對兩個問題進(jìn)行說明:
- 橫向rv和viewpager滾動沖突
- rv滾動到底部監(jiān)聽
首先我們寫一個自定義的rv
public class DefRecylerView extends RecyclerView {
public DefRecylerView(Context context) {
super(context);
}
public DefRecylerView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public DefRecylerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
}
- rv恬吕、viewpager滾動沖突
當(dāng)遇到外層viewpager里面有一個橫向滾動的rv熏版,為防止rv滾動到最右側(cè)時觸發(fā)viewpager的滾動我們需要這樣做:
private ViewPager viewPager = null;
public void setViewPager(ViewPager viewPager) {
this.viewPager = viewPager;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (viewPager != null) {
getParent().requestDisallowInterceptTouchEvent(true);
}
return super.dispatchTouchEvent(ev);
}
我們在自定義的rv中重寫dispatchTouchEvent方法,最為核心的一句代碼為:
getParent().requestDisallowInterceptTouchEvent(true);
意思是當(dāng)外層view是viewpager時番捂,我們?nèi)∠鹶iewpager對滾動事件的攔截摸袁,讓滾動事件繼續(xù)往下傳遞到rv惕虑,從而實(shí)現(xiàn)了橫向rv滾動到最右側(cè)時不觸發(fā)viewpager的滾動。
- rv滾動到底部監(jiān)聽
自定義rv中重寫onScroll方法,定義一個回調(diào)接口睛挚,當(dāng)rv滾動到底部時回調(diào)通知邪蛔,適用于列表數(shù)據(jù)加載更多操作。
回調(diào)接口:
public interface OnSlideBottomListener {
/**
* 滾動到底部
*/
void onSlideBottom();
}
重寫onScroll:
private OnSlideBottomListener onSlideBottomListener = null;
public void setOnSlideBottomListener(OnSlideBottomListener onSlideBottomListener) {
this.onSlideBottomListener = onSlideBottomListener;
}
@Override
public void onScrolled(int dx, int dy) {
if (isSlideToBottom()) {
if (onSlideBottomListener != null) {
onSlideBottomListener.onSlideBottom();
}
}
}
/**
* 是否滑動到底部
*/
public boolean isSlideToBottom() {
if (this.getLayoutManager() instanceof LinearLayoutManager) {
LinearLayoutManager layoutManager = (LinearLayoutManager) this.getLayoutManager();
if (layoutManager.getOrientation() == LinearLayoutManager.VERTICAL) {
return this != null
&& this.computeVerticalScrollExtent() + this.computeVerticalScrollOffset()
>= this.computeVerticalScrollRange();
} else {
return this != null
&& this.computeHorizontalScrollExtent() + this.computeHorizontalScrollOffset()
>= this.computeHorizontalScrollRange();
}
} else if(this.getLayoutManager() instanceof StaggeredGridLayoutManager){
StaggeredGridLayoutManager layoutManager = (StaggeredGridLayoutManager) this.getLayoutManager();
if (layoutManager.getOrientation() == StaggeredGridLayoutManager.VERTICAL) {
return this != null
&& this.computeVerticalScrollExtent() + this.computeVerticalScrollOffset()
>= this.computeVerticalScrollRange();
} else {
return this != null
&& this.computeHorizontalScrollExtent() + this.computeHorizontalScrollOffset()
>= this.computeHorizontalScrollRange();
}
}
return false;
}