今天開始講RecycleView的系列教程郁稍。分割線赦政,分組,局部刷新耀怜,動態(tài)添加恢着,緩存原理,抖音效果财破,瀑布流掰派。嵌套,動畫等等
分析:
1.滑動過半的判斷PagerSnapHelper
2.滑動過半添加在哪左痢,通過自定義layoutManager
3.得到滑動的view靡羡,和position
4.初始化和銷毀的時機? recycleVIewchild銷毀
監(jiān)聽滑動的位置:
publicvoidonScrollStateChanged(intstate) {
switch(state) {
caseRecyclerView.SCROLL_STATE_IDLE:
ViewviewIdle=mPagerSnapHelper.findSnapView(this);
intpositionIdle=getPosition(viewIdle);
if(mOnViewPagerListener!=null&&getChildCount()==1) {
mOnViewPagerListener.onPageSelected(positionIdle,positionIdle==getItemCount()-1);
? ? ? ? ? ? ? ? }
break;
caseRecyclerView.SCROLL_STATE_DRAGGING:
ViewviewDrag=mPagerSnapHelper.findSnapView(this);
intpositionDrag=getPosition(viewDrag);
break;
caseRecyclerView.SCROLL_STATE_SETTLING:
ViewviewSettling=mPagerSnapHelper.findSnapView(this);
intpositionSettling=getPosition(viewSettling);
break;
? ? ? ? }
? ? }
監(jiān)聽recycleVIew子child銷毀
privateRecyclerView.OnChildAttachStateChangeListenermChildAttachStateChangeListener=newRecyclerView.OnChildAttachStateChangeListener() {
@Override
publicvoidonChildViewAttachedToWindow(Viewview) {
if(mOnViewPagerListener!=null&&getChildCount()==1) {
mOnViewPagerListener.onInitComplete();
? ? ? ? ? ? }
? ? ? ? }
@Override
publicvoidonChildViewDetachedFromWindow(Viewview) {
if(mDrift>=0){
if(mOnViewPagerListener!=null)mOnViewPagerListener.onPageRelease(true,getPosition(view));
}else{
if(mOnViewPagerListener!=null)mOnViewPagerListener.onPageRelease(false,getPosition(view));
? ? ? ? ? ? }
? ? ? ? }
? ? };
PagerSnapHelper找到view
ViewviewSettling=mPagerSnapHelper.findSnapView(this);
通過view得到Positon
源碼:
public class DouyinLayoutManagerextends LinearLayoutManager {
private static final StringTAG ="ViewPagerLayoutManager";
? ? private PagerSnapHelpermPagerSnapHelper;
? ? private OnViewPagerListenermOnViewPagerListener;
? ? private RecyclerViewmRecyclerView;
? ? private int mDrift;//位移,用來判斷移動方向
? ? public DouyinLayoutManager(Context context, int orientation) {
super(context, orientation, false);
? ? ? ? init();
? ? }
public DouyinLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
? ? ? ? init();
? ? }
private void init() {
mPagerSnapHelper =new PagerSnapHelper();
? ? }
@Override
public void onAttachedToWindow(RecyclerView view) {
super.onAttachedToWindow(view);
? ? ? ? mPagerSnapHelper.attachToRecyclerView(view);
? ? ? ? this.mRecyclerView = view;
? ? ? ? mRecyclerView.addOnChildAttachStateChangeListener(mChildAttachStateChangeListener);
? ? }
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
super.onLayoutChildren(recycler, state);
//
? ? }
/**
? ? * 滑動狀態(tài)的改變
? ? * 緩慢拖拽-> SCROLL_STATE_DRAGGING
? ? * 快速滾動-> SCROLL_STATE_SETTLING
? ? * 空閑狀態(tài)-> SCROLL_STATE_IDLE
? ? * @param state
? ? */
? ? @Override
public void onScrollStateChanged(int state) {
switch (state) {
case RecyclerView.SCROLL_STATE_IDLE:
View viewIdle =mPagerSnapHelper.findSnapView(this);
? ? ? ? ? ? ? ? int positionIdle = getPosition(viewIdle);
? ? ? ? ? ? ? ? if (mOnViewPagerListener !=null && getChildCount() ==1) {
mOnViewPagerListener.onPageSelected(positionIdle,positionIdle == getItemCount() -1);
? ? ? ? ? ? ? ? }
break;
? ? ? ? ? ? case RecyclerView.SCROLL_STATE_DRAGGING:
View viewDrag =mPagerSnapHelper.findSnapView(this);
? ? ? ? ? ? ? ? int positionDrag = getPosition(viewDrag);
break;
? ? ? ? ? ? case RecyclerView.SCROLL_STATE_SETTLING:
View viewSettling =mPagerSnapHelper.findSnapView(this);
? ? ? ? ? ? ? ? int positionSettling = getPosition(viewSettling);
break;
? ? ? ? }
}
/**
? ? * 監(jiān)聽豎直方向的相對偏移量
? ? * @param dy
? ? * @param recycler
? ? * @param state
? ? * @return
? ? */
? ? @Override
public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
this.mDrift = dy;
? ? ? ? return super.scrollVerticallyBy(dy, recycler, state);
? ? }
/**
? ? * 監(jiān)聽水平方向的相對偏移量
? ? * @param dx
? ? * @param recycler
? ? * @param state
? ? * @return
? ? */
? ? @Override
public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) {
this.mDrift = dx;
? ? ? ? return super.scrollHorizontallyBy(dx, recycler, state);
? ? }
/**
? ? * 設(shè)置監(jiān)聽
? ? * @param listener
? ? */
? ? public void setOnViewPagerListener(OnViewPagerListener listener){
this.mOnViewPagerListener = listener;
? ? }
private RecyclerView.OnChildAttachStateChangeListenermChildAttachStateChangeListener =new RecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
if (mOnViewPagerListener !=null && getChildCount() ==1) {
mOnViewPagerListener.onInitComplete();
? ? ? ? ? ? }
}
@Override
public void onChildViewDetachedFromWindow(View view) {
if (mDrift >=0){
if (mOnViewPagerListener !=null)mOnViewPagerListener.onPageRelease(true,getPosition(view));
? ? ? ? ? ? }else {
if (mOnViewPagerListener !=null)mOnViewPagerListener.onPageRelease(false,getPosition(view));
? ? ? ? ? ? }
}
};
}
public class DouyinActivityextends AppCompatActivity {
private static final StringTAG ="ViewPagerActivity";
? ? private RecyclerViewmRecyclerView;
? ? private MyAdaptermAdapter;
? ? private DouyinLayoutManagermLayoutManager;
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_view_pager_layout_manager);
? ? ? ? initView();
? ? ? ? initListener();
? ? }
private void initView() {
mRecyclerView = findViewById(R.id.recycler);
? ? ? ? mLayoutManager =new DouyinLayoutManager(DouyinActivity.this, OrientationHelper.VERTICAL);
? ? ? ? mAdapter =new MyAdapter();
? ? ? ? mRecyclerView.setLayoutManager(mLayoutManager);
? ? ? ? mRecyclerView.setAdapter(mAdapter);
? ? }
private void initListener(){
mLayoutManager.setOnViewPagerListener(new OnViewPagerListener() {
@Override
? ? ? ? ? ? public void onInitComplete() {
Log.e(TAG,"onInitComplete");
? ? ? ? ? ? ? ? playVideo(0);
? ? ? ? ? ? }
@Override
? ? ? ? ? ? public void onPageRelease(boolean isNext,int position) {
Log.e(TAG,"釋放位置:"+position +" 下一頁:"+isNext);
? ? ? ? ? ? ? ? int index =0;
? ? ? ? ? ? ? ? if (isNext){
index =0;
? ? ? ? ? ? ? ? }else {
index =1;
? ? ? ? ? ? ? ? }
releaseVideo(index);
? ? ? ? ? ? }
@Override
? ? ? ? ? ? public void onPageSelected(int position,boolean isBottom) {
Log.e(TAG,"選中位置:"+position+"? 是否是滑動到底部:"+isBottom);
? ? ? ? ? ? ? ? playVideo(0);
? ? ? ? ? ? }
});
? ? }