美文网首页
RecyclerView

RecyclerView

作者: 冬冬269 | 来源:发表于2018-08-21 12:34 被阅读0次

    ItemDecorartion

    addItemDecotation
    用来修饰item的间隔,只需要重写里面的三个方法,ondraw(),onDrawOver(),getItemOffSet();

    getItemOffSet()用来给间隔腾出空间。
    onDraw()是先画间隔,空间不足,itemview会覆盖。
    onDraw()后画建个,空间不足,会覆盖itemview。


    image.png
     @Override
        public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
            super.onDraw(c, parent, state);
    
            //画数字
            int childCount = parent.getChildCount();
            for (int i = 0;i<childCount;i++){
                View childAt = parent.getChildAt(i);
                int childAdapterPosition = parent.getChildAdapterPosition(childAt);
                if(childAdapterPosition == 0 ||childAdapterPosition == 6||childAdapterPosition ==13||childAdapterPosition == 17||childAdapterPosition == 19 ){
                    RectF rectF = new RectF();
                    rectF.top = childAt.getTop()-60;//留出30px的格子
                    rectF.bottom = childAt.getTop();//就是顶
    
                    rectF.left = 0;
                    rectF.right = childAt.getRight();
                    //黄色背景 黑色字
                    paint.setColor(Color.YELLOW);
                    c.drawRect(rectF,paint);
    
                }
    
            }
        }
    
    
        @Override
        public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
            super.onDrawOver(c, parent, state);
            //拿到最上面的
            View childAt = parent.getChildAt(0);
            int childAdapterPosition = parent.getChildAdapterPosition(childAt);
            //
            //判断是不是最后一个
            int childCount = parent.getChildCount();
                if(childAdapterPosition == 5||childAdapterPosition ==12||childAdapterPosition == 16||childAdapterPosition == 18){
                    //是最后一个
                    int bottom = childAt.getBottom();
                    int top = bottom+ 60;
                    //判断大小
                    if(parent.getPaddingTop()+60>bottom){
                        RectF rectF = new RectF();
                        rectF.top = bottom - 60;//留出30px的格子
                        rectF.bottom = bottom;//就是顶
    
                        rectF.left = 0;
                        rectF.right = 1000;
                        //黄色背景 黑色字
                         paint.setColor(Color.BLACK);
                        c.drawRect(rectF,paint);
                    }else{
    
                        RectF rectF = new RectF();
                        rectF.top = parent.getPaddingTop();//留出30px的格子
                        rectF.bottom = parent.getPaddingTop()+60;//就是底子
    
                        rectF.left = 0;
                        rectF.right = 1000;
                        //黄色背景 黑色字
                        // paint.setColor(Color.YELLOW);
                        paint.setColor(Color.BLACK);
                        c.drawRect(rectF,paint);
                    }
    
                }else{
                    //不是最后一个
    
                    RectF rectF = new RectF();
                    rectF.top = parent.getPaddingTop();//留出30px的格子
                    rectF.bottom = parent.getPaddingTop()+60;//就是顶
    
                    rectF.left = 0;
                    rectF.right = 1000;
                    //黄色背景 黑色字
                    // paint.setColor(Color.YELLOW);
                    paint.setColor(Color.BLACK);
                    c.drawRect(rectF,paint);
                }
                    //
    
        }
    
        /**
         * 为了实现粘性头部
         *
         */
    
    
    
        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            super.getItemOffsets(outRect, view, parent, state);
    
    
            //判断后 撑开一个位置 没有数据 就假设 1 5 7 3 4
            int truePosition = parent.getChildAdapterPosition(view);
            if(truePosition == 0 ||truePosition == 6||truePosition ==13||truePosition == 17||truePosition == 19 ){
                //撑开
                outRect.top = 60;//留出30px的格子
    
            }
    
        }
    
    20170417152906794.gif

    仿照大神做的。
    实现思路。
    头部固定的header是top = padding.getPaddingTop。bottom = padding.getPaddingTop+width。
    为了实现顶的效果。判断可视的第一个view,的bottom是否小于header的底部。是的话把自己的赋值给header。好了。剩下的明天继续。

    LayoutManager

    LinearLayoutManager:以线性布局展示,可以设置横向和纵向
    GridLayoutManager:以网格形式展示,类似GridView效果
    StaggeredGridLayoutManager:以瀑布流形式的效果

    ItemAnimator

    给item设置动画。删除动画,添加动画等。

     recyclerView.setItemAnimator(new DefaultItemAnimator());
    
    image.png

    局部item的添加,删除,变换,刷新,真叼。

    拖拽删除,拖拽修改位置。

    image.png
    MyItemTouchCallback myItemTouchCallback = new MyItemTouchCallback();
            ItemTouchHelper itemTouchHelper = new ItemTouchHelper(myItemTouchCallback);
            recyclerView.setAdapter(myRecyclerAdapter);
            itemTouchHelper.attachToRecyclerView(recyclerView);
    

    主要看callback怎么实现的吧。

     @Override
        public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
            int a = ItemTouchHelper.UP|ItemTouchHelper.DOWN|ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT;
            int b = ItemTouchHelper.LEFT;
    
            return makeMovementFlags(a,b);
    
        }
    

    确定a变换位置的可滑动方向,b确定左右滑动的可滑动方向。

    
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            //变换位置。
            return false;
        }
    
      @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
            //删除
          
        }
    

    变换和删除 分别调用adapter的move和remove方法,并且修改数据源就好了。

    4、public boolean isLongPressDragEnabled():该方法返回true时,表示支持长按拖动,即长按ItemView后才可以拖动,我们遇到的场景一般也是这样的。默认是返回true。

    5、public boolean boolean isItemViewSwipeEnabled():该方法返回true时,表示如果用户触摸并左右滑动了View,那么可以执行滑动删除操作,即可以调用到onSwiped()方法。默认是返回true。

    6、public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState):从静止状态变为拖拽或者滑动的时候会回调该方法,参数actionState表示当前的状态。 一般可用于给选中的itemview设置高亮改变背景等等。用之前根据state判断一下。

    actionState != ItemTouchHelper.ACTION_STATE_IDLE
    

    7、public void clearView(RecyclerView recyclerView, ViewHolder viewHolder):当用户操作完毕某个item并且其动画也结束后会调用该方法,一般我们在该方法内恢复ItemView的初始状态,防止由于复用而产生的显示错乱问题。把设置的高亮或者背景调回来。

    8、public void onChildDraw(…):我们可以在这个方法内实现我们自定义的交互规则或者自定义的动画效果。 滑动中逐渐修改itemview的透明度,滑动中出现删除view等等。
    那么完整的SimpleItemTouchHelperCallback文件是这样的:

    自定义添加上拉刷新和下拉刷新,第三方控件BGArefreshLayout,原生swiperefreshlayout

    下一篇,封装adapter。

    相关文章

      网友评论

          本文标题:RecyclerView

          本文链接:https://www.haomeiwen.com/subject/elkliftx.html