增加RecyclerView项目的延迟

时间:2018-08-10 01:15:19

标签: android android-recyclerview

我有一个简单的RecyclerView.ViewHolder类,当将数据绑定到视图时,该类使新项目“按比例放大”。使用LinearLayoutManager时,动画看起来不错,但是当使用GridLayoutManager时,行中的所有项目都同时“放大”。

我的目标是使项目彼此“放大”。我不确定如何完成此操作以及如何向每个项目添加此“延迟”。

我能想到的一种方法是跟踪当前位置并为每个动画添加不同的offsetDelay(如果连续第1个项目执行500ms,如果连续第二个项目执行1000ms,依此类推),但是这种方法给了我奇怪的结果:

它对于单行工作正常,但是当我向下滚动时,在上一行的最后一项停止缩放之前,下一行已经开始放大:

enter image description here

有更好的方法吗?谢谢!

我在其中应用动画的ViewHolder类:

public class ItemHolder extends RecyclerView.ViewHolder
{
   private TextView txtTitle;
   private View     viewItem;

    public ItemHolder( @NonNull View viewItem )
    {
        super( viewItem );

        this.viewItem = viewItem;
        this.txtTitle = itemView.findViewById( R.id.txtTitle );
    }

    public void bindData( final Item item )
    {
        this.txtTitle.setText( item.getTitle() );

        this.animationScaleIn( this.viewItem );
    }

    private void animationScaleIn( View view )
    {
        ScaleAnimation animationScaleIn = new ScaleAnimation( 0.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f );

        if( this.position % 2f == 0 )
        {
            animationScaleIn.setDuration( 800 );
        }
        else
        {
            animationScaleIn.setDuration( 800 * 2 );
        }

        view.startAnimation( animationScaleIn );
    }
}

这是ItemAdapter:

public class ItemAdapter extends RecyclerView.Adapter
{
    private List<Item> items = new ArrayList<>();

    public ItemAdapter( final List<Item> items )
    {
        if( items != null )
            this.items = items;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder( @NonNull ViewGroup viewGroup, int position )
    {
        final View view = LayoutInflater.from( viewGroup.getContext() ).inflate( position, viewGroup, false );
        return new ItemHolder( view );
    }

    @Override
    public void onBindViewHolder( @NonNull RecyclerView.ViewHolder viewHolder, int position )
    {
        ((ItemHolder)viewHolder).bindData( this.items.get( position ) );
    }

    @Override
    public int getItemViewType( final int position )
    {
        return R.layout.item;
    }

    @Override
    public int getItemCount()
    {
        return this.items.size();
    }
}

0 个答案:

没有答案