RecyclerView 从使用到源码(2)几个常用的关键点

#一.目标
####在日常的使用RecyclerView的时候,为了提升性能或者实现特定的效果,我们除了第一篇文章中提到的方法使用还有一些别的“技巧”,而这些技巧想要用的灵活就要从各个类的源码出发来看,后面的文章会解析这部分内容。而本文只是展示一些日常的使用技巧。
#二.涉及的点
####刷新的各个方法
####自定义Item动画
#三.刷新的各个方法
####下面是各个刷新方法,各有特色,请注意看注释
####全部刷新

//1.由于没有指定是单个item的改变还是整个列表结构的改变,所以强制整体刷新(item内容刷新和结构刷新)
//2.如果确定了刷新动作,如插入,移动,删除等,推荐使用具体的下面的刷新方法
public final void notifyDataSetChanged()

####插入

//1.position:item插入的索引位置
//2.列表结构性改变,列表结构刷新;position前面索引位置上的item不动,后面的顺移
//3.只有position位置item刷新,其他位置item认为内容没变不刷新
public final void notifyItemInserted(int position)
//1.positionStart插入item起点,刷新条目数itemCount个
//2.刷新策略同上:结构刷新;插入的item内容刷新,其他item内容不刷新。
public final void notifyItemRangeInserted(int positionStart, int itemCount)

####删除

//1.position:item删除的索引位置
//2.同上插入的刷新策略:结构性刷新;剩余的item内容不刷新
public final void notifyItemRemoved(int position)
//1.从positionStart开始删除,删除itemCount条
//2.这itemCount条item删除,其他不刷新
public final void notifyItemRangeRemoved(int positionStart, int itemCount)

####刷新

//position位置的item刷新,别的不刷新
public final void notifyItemChanged(int position)
//1.position位置的item刷新,别的不刷新
//2.payload为刷新因子
public final void notifyItemChanged(int position, Object payload)
//1.从positionStart开始刷新,刷新itemCount条
public final void notifyItemRangeChanged(int positionStart, int itemCount)
////1.从positionStart开始刷新,刷新itemCount条
2.payload为刷新因子
public final void notifyItemRangeChanged(int positionStart, int itemCount, Object payload)

####移动

//fromPosition和toPosition的item互换
public final void notifyItemMoved(int fromPosition, int toPosition)

####注意上面的含有payload的方法,想根据payload来刷新item中特定的view,就要实现Adapter中的下面的方法

@Override
    public void onBindViewHolder(MyViewHolder holder, int position, List<Object> payloads) {
        if (payloads.isEmpty()){
            onBindViewHolder(holder,position);
        }else {
            Object obj = payloads.get(0);
            //根据obj的数据刷新具体控件
        }
    }

#四.item的动画
注意使用notifyDataSetChanged的时候是没有动画的。
在自定义item的动画之前,我们看默认的动画类是如何实现的。DefaultItemAnimator类分析的必要性:DefaultItemAnimator继承自SimpleItemAnimator,而SimpleItemAnimator继承自RecyclerView.ItemAnimator。而我们想要修快速的实现自己的itemAnimator那么我们研究DefaultItemAnimator,并自己继承SimpleItemAnimator来重写其中关键方法就好了。
##4.1DefaultItemAnimator分析
###关键代码
想找关键代码,那么我们就要知道哪些代码是必须要实现的,那些必须实现的代码必定就是关键代码了啊。我们新建一个类MyAnimator 并让他继承SimpleItemAnimator,如下

public class MyAnimator extends SimpleItemAnimator{
    @Override
    public boolean animateRemove(RecyclerView.ViewHolder holder) {
        return false;
    }

    @Override
    public boolean animateAdd(RecyclerView.ViewHolder holder) {
        return false;
    }

    @Override
    public boolean animateMove(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) {
        return false;
    }

    @Override
    public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromLeft, int fromTop, int toLeft, int toTop) {
        return false;
    }

    @Override
    public void runPendingAnimations() {

    }

    @Override
    public void endAnimation(RecyclerView.ViewHolder item) {

    }

    @Override
    public void endAnimations() {

    }

    @Override
    public boolean isRunning() {
        return false;
    }
}

从中我们找到了8个必须要实现的方法,我们一个个分析。我们看DefaultItemAnimator中对应的8个方法。
####animateRemove
仔细看代码中注释

public boolean animateRemove(final ViewHolder holder) {
        resetAnimation(holder);
        mPendingRemovals.add(holder);
        return true;
    }

里面俩方法resetAnimation(holder);mPendingRemovals.add(holder),前者如下面代码,后者往“即将执行移除List”中添加ViewHolder。

	private void resetAnimation(RecyclerView.ViewHolder holder) {
		//初始化属性动画插值器
        if (sDefaultInterpolator == null) {
            sDefaultInterpolator = new ValueAnimator().getInterpolator();
        }
        //给属性动画添加插值器
        holder.itemView.animate().setInterpolator(sDefaultInterpolator);
        //调用结束动画
        endAnimation(holder);
    }

猜你喜欢

转载自blog.csdn.net/gongxiaoou/article/details/80616191
今日推荐