关于RecycleView的学习总结

RecycleView
方法:
1.recyclerView.setHasFixedSize(true);
//当知道Adapter内的Item的改变不会影响RecycleView宽高的时候,可以设置为true,避免重新计算大小;但当刷新数据使adapter.NotifyDataSetChanged()时(全局刷新),这个方法将不起作用,可以使用recycleview的增删改插方法,增删改插方法最后会调用triggerUpdateProcessor,里面有对这个值进行判断
2.recyclerView.setLayoutManager(layoutManager);
//用来设置是布局的,可以是LinearLayoutManager(线性);GirdLayoutManager(表格布局);StaggeredGridLayoutManager(瀑布流效果)三种方式
1)LinearLayoutManager,三个构造方法
LinearLayoutManager(Context context)
LinearLayoutManager(Context context,int orientation,boolean reverseLayout)//第二个参数:方向;第三个参数,是否倒序(true 是,RecyclerView会自动滑到末尾,如何想要倒序且不自动滑倒底部可以使用
layoutManager.setReverseLayout(true);
layoutManager.setStackFromEnd(true))//表示从底部开始展示;
LinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr,int defStyleRes)
//滑动到某一个item,可以在adapter之前使用
manager.scrollToPosition(15)
manager.scrollToPositionWithOffset(15,30),同样会滑动到adapter positoin为15的item,但整个RecycelrView中的内容,向下偏移了30 px
//返回特定item;需要在页面完全加载完才能返回正确的值
// layoutManager.findViewByPosition()找到特定的item
// layoutManager.findFirstVisibleItemPosition()第一个显示的item
// layoutManager.findFirstCompletelyVisibleItemPosition()第一个全部展示的item
// layoutManager.findLastCompletelyVisibleItemPosition()最后一个展示完全的item
// layoutManager.findLastVisibleItemPosition()最后一个显示的item
2)GirdLayoutManager
GridLayoutManager(Context context, int spanCount) ;
GridLayoutManager(Context context, int spanCount, int orientation,boolean reverseLayout)//第二个参数 列数,第三:方向,第四是否倒序
GridLayoutManager(Context context, int spanCount, int orientation,boolean reverseLayout)
不可以使用layoutManager.setStackFromEnd(true);其他方法与LinearLayoutManager一样
3)StaggeredGridLayoutManager
StaggeredGridLayoutManager(int spanCount, int orientation) 列数,方向
StaggeredGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr,int defStyleRes)

3.recyclerView.addItemDecoration(new RecycleViewDivider(this, LinearLayoutManager.VERTICAL));//添加分割线
自己创建一个类继承RecyclerView.ItemDecoration,重写getItemOffsets//获取分割线尺寸;onDraw//绘制分割线
分割线可以自定义样式和使用图片
4.RecyclerView.setItemAnimator( new DefaultItemAnimator())//添加动画(Add、Remove、Move、Change四种动画)使用动画的时候不能使用Adapter.notifyDataSetChanged();
只能使用
notifyItemChanged(int position),position数据发生了改变
public final void notifyItemRangeChanged(int positionStart, int itemCount),顾名思义,可以刷新从positionStart开始itemCount数量的item了(这里的刷新指回调onBindViewHolder()方法)。

public final void notifyItemInserted(int position),这个方法是在第position位置被插入了一条数据的时候可以使用这个方法刷新,注意这个方法调用后会有插入的动画,这个动画可以使用默认的,也可以自己定义。

public final void notifyItemMoved(int fromPosition, int toPosition),这个方法是从fromPosition移动到toPosition为止的时候可以使用这个方法刷新

public final void notifyItemRangeInserted(int positionStart, int itemCount),显然是批量添加。

public final void notifyItemRemoved(int position),第position个被删除的时候刷新,同样会有动画。

public final void notifyItemRangeRemoved(int positionStart, int itemCount),批量删除。
注意!当我们进行删除添加操作时,会出现角标变化,如何还是用原来的角标可能出现错误可以使用如下方法进行删除
mPlans.remove(postion);
mAdapter.notifyItemRemoved(postion);
notifyItemRangeRemoved(int positionStart, int itemCount);刷新从positionStart开始的,共itemCount个数据

动画 可以使用默认的也可自己写,不过不能继承DefaultItemAnimator因为其把动画私有了,需要自己写DefaultItemAnimator中
更改动画效果的几个方法
animateAdd( )
animateAddImpl( )

animateRemove( )
animateRemoveImpl( )

animateMove( )
animateMoveImpl( )

animateChange( )
animateChangeImpl( )

如删除// public boolean animateRemove(final RecyclerView.ViewHolder holder) {
resetAnimation(holder);
ViewCompat.setTranslationX(holder.itemView,holder.itemView.getWidth());
mPendingRemovals.add(holder);
return true;
}

private void animateRemoveImpl(final RecyclerView.ViewHolder holder) {
    final View view = holder.itemView;
    final ViewPropertyAnimatorCompat animation = ViewCompat.animate(view);
    mRemoveAnimations.add(holder);
    animation.setDuration(getRemoveDuration())
            .alpha(0).translationX(2*holder.itemView.getWidth()).setListener(new VpaListenerAdapter() {
        @Override
        public void onAnimationStart(View view) {
            dispatchRemoveStarting(holder);
        }

        @Override
        public void onAnimationEnd(View view) {
            animation.setListener(null);
            ViewCompat.setAlpha(view, 1);
            dispatchRemoveFinished(holder);
            mRemoveAnimations.remove(holder);
            dispatchFinishedWhenDone();
        }
    }).start();
}

Adapter
继承RecyclerView.Adapter
重写getItemViewType 可以用来进行多布局,
onCreateViewHolder 创建布局
onBindViewHolder 绑定数据与布局

点击事件
RecycleView 没有自己的点击事件,需要开发着自己写接口回调RecycleView
方法:
1.recyclerView.setHasFixedSize(true);//当知道Adapter内的Item的改变不会影响RecycleView宽高的时候,可以设置为true,避免重新计算大小;但当刷新数据使adapter.NotifyDataSetChanged()时(全局刷新),这个方法将不起作用,可以使用recycleview的增删改插方法,增删改插方法最后会调用triggerUpdateProcessor,里面有对这个值进行判断
2.recyclerView.setLayoutManager(layoutManager);//用来设置是布局的,可以是LinearLayoutManager(线性);GirdLayoutManager(表格布局);StaggeredGridLayoutManager(瀑布流效果)三种方式
1)LinearLayoutManager,三个构造方法
LinearLayoutManager(Context context)
LinearLayoutManager(Context context,int orientation,boolean reverseLayout)//第二个参数:方向;第三个参数,是否倒序(true 是,RecyclerView会自动滑到末尾,如何想要倒序且不自动滑倒底部可以使用
layoutManager.setReverseLayout(true);
layoutManager.setStackFromEnd(true))//表示从底部开始展示;
LinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr,int defStyleRes)
//滑动到某一个item,可以在adapter之前使用
manager.scrollToPosition(15)
manager.scrollToPositionWithOffset(15,30),同样会滑动到adapter positoin为15的item,但整个RecycelrView中的内容,向下偏移了30 px
//返回特定item;需要在页面完全加载完才能返回正确的值
// layoutManager.findViewByPosition()找到特定的item
// layoutManager.findFirstVisibleItemPosition()第一个显示的item
// layoutManager.findFirstCompletelyVisibleItemPosition()第一个全部展示的item
// layoutManager.findLastCompletelyVisibleItemPosition()最后一个展示完全的item
// layoutManager.findLastVisibleItemPosition()最后一个显示的item
2)GirdLayoutManager
GridLayoutManager(Context context, int spanCount) ;
GridLayoutManager(Context context, int spanCount, int orientation,boolean reverseLayout)//第二个参数 列数,第三:方向,第四是否倒序
GridLayoutManager(Context context, int spanCount, int orientation,boolean reverseLayout)
不可以使用layoutManager.setStackFromEnd(true);其他方法与LinearLayoutManager一样
3)StaggeredGridLayoutManager
StaggeredGridLayoutManager(int spanCount, int orientation) 列数,方向
StaggeredGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr,int defStyleRes)

3.recyclerView.addItemDecoration(new RecycleViewDivider(this, LinearLayoutManager.VERTICAL));//添加分割线
自己创建一个类继承RecyclerView.ItemDecoration,重写getItemOffsets//获取分割线尺寸;onDraw//绘制分割线
分割线可以自定义样式和使用图片
4.RecyclerView.setItemAnimator( new DefaultItemAnimator())//添加动画(Add、Remove、Move、Change四种动画)使用动画的时候不能使用Adapter.notifyDataSetChanged();
只能使用
notifyItemChanged(int position),position数据发生了改变
public final void notifyItemRangeChanged(int positionStart, int itemCount),顾名思义,可以刷新从positionStart开始itemCount数量的item了(这里的刷新指回调onBindViewHolder()方法)。

public final void notifyItemInserted(int position),这个方法是在第position位置被插入了一条数据的时候可以使用这个方法刷新,注意这个方法调用后会有插入的动画,这个动画可以使用默认的,也可以自己定义。

public final void notifyItemMoved(int fromPosition, int toPosition),这个方法是从fromPosition移动到toPosition为止的时候可以使用这个方法刷新

public final void notifyItemRangeInserted(int positionStart, int itemCount),显然是批量添加。

public final void notifyItemRemoved(int position),第position个被删除的时候刷新,同样会有动画。

public final void notifyItemRangeRemoved(int positionStart, int itemCount),批量删除。
注意!当我们进行删除添加操作时,会出现角标变化,如何还是用原来的角标可能出现错误可以使用如下方法进行删除
mPlans.remove(postion);
mAdapter.notifyItemRemoved(postion);
notifyItemRangeRemoved(int positionStart, int itemCount);刷新从positionStart开始的,共itemCount个数据

动画 可以使用默认的也可自己写,不过不能继承DefaultItemAnimator因为其把动画私有了,需要自己写DefaultItemAnimator中
更改动画效果的几个方法
animateAdd( )
animateAddImpl( )

animateRemove( )
animateRemoveImpl( )

animateMove( )
animateMoveImpl( )

animateChange( )
animateChangeImpl( )

如删除// public boolean animateRemove(final RecyclerView.ViewHolder holder) {
resetAnimation(holder);
ViewCompat.setTranslationX(holder.itemView,holder.itemView.getWidth());
mPendingRemovals.add(holder);
return true;
}

private void animateRemoveImpl(final RecyclerView.ViewHolder holder) {
    final View view = holder.itemView;
    final ViewPropertyAnimatorCompat animation = ViewCompat.animate(view);
    mRemoveAnimations.add(holder);
    animation.setDuration(getRemoveDuration())
            .alpha(0).translationX(2*holder.itemView.getWidth()).setListener(new VpaListenerAdapter() {
        @Override
        public void onAnimationStart(View view) {
            dispatchRemoveStarting(holder);
        }

        @Override
        public void onAnimationEnd(View view) {
            animation.setListener(null);
            ViewCompat.setAlpha(view, 1);
            dispatchRemoveFinished(holder);
            mRemoveAnimations.remove(holder);
            dispatchFinishedWhenDone();
        }
    }).start();
}

Adapter
继承RecyclerView.Adapter
重写getItemViewType 可以用来进行多布局,
onCreateViewHolder 创建布局
onBindViewHolder 绑定数据与布局

点击事件
RecycleView 没有自己的点击事件,需要开发着自己写接口回调

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值