2017-04-07 41 views
1

我有一个特殊的动画,用于填充我的RecyclerView的卡片。动画效果很好(至少对于充气)。我不想在最初的通货膨胀之后使用这个动画。换句话说,我不希望有任何滚动的动画(或者在用户填充足够的卡片充满用户的屏幕之后用户的任何动作)。我无法弄清楚如何获取位置编号 - 或者 - 填充后关闭动画 - 或者 - 以任何方式执行此操作。我的动画在适配器中调用。这是我用来设置动画的适配器代码。回收站查看屏幕后停止动画

public class TagAdapter extends RecyclerView.Adapter<TagAdapter.ViewHolder>{ 
private ArrayList<TagDataModel> dataSet; 
private Context context; 

public TagAdapter (ArrayList<TagDataModel> ds, Context ctx){ 
    this.dataSet =ds; 
    this.context =ctx; 
} 

class ViewHolder extends RecyclerView.ViewHolder { 
    TextView tv_tag; 
    ArrayList<TagDataModel> dataSet = new ArrayList<>(); 
    Context context; 
    CardView card; 

    ViewHolder(View itemView, Context ctx, ArrayList<TagDataModel> ds) { 
     super(itemView); 
     this.dataSet = ds; 
     this.context =ctx; 
     this.tv_tag = (TextView) itemView.findViewById(R.id.tv_cardTag); 
     this.card = (CardView) itemView.findViewById(R.id.card_view_tag); 
    } 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_tag, parent, false); 
    ViewHolder viewHolder = new ViewHolder(view, context, dataSet); 
    return viewHolder; 
} 

@Override 
public void onBindViewHolder(final ViewHolder holder, @SuppressLint("RecyclerView") final int position) { 
    final int activePosition = context.getSharedPreferences("userPrefs", Context.MODE_PRIVATE).getInt("np_tag", 0); 
    TextView tv_tag = holder.tv_tag; 
    CardView card = holder.card; 
    tv_tag.setText(dataSet.get(position).getTag()); 

    }); 
    animate(holder.itemView, position); //animate only first page UPDATE 
} 

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

private void animate(View view, final int pos) { 
    view.animate().cancel(); 
    view.setTranslationY(100); 
    view.setAlpha(0); 
    view.animate().alpha(1.0f).translationY(0).setDuration(300).setStartDelay(pos *100); 
} 

回答

0

从bindViewHolder和 使用习惯ItemAnimator删除当前动画,并覆盖animateAdd方法。 你可以找到更多here

这应该给你想要的结果。

public class MyItemAnimator extends DefaultItemAnimator { 

@Override 
    public boolean animateAdd(ViewHolder viewHolder) { 
     animate(viewHolder.itemView); 
     return true; 
    } 

private void animate(View view) { 
    view.setTranslationY(100); 
    view.setAlpha(0); 
    view.animate().alpha(1.0f).translationY(0).setDuration(300); 
} 


} 

现在将这个项目的动画设置为您的recyclerview。

recyclerView.setItemAnimator(new MyItemAnimator());

试试这个:)

+0

我相信这个链接告诉我如何结束动画。我可以这样做,但我需要知道如何在通货膨胀后结束动画*。这对我来说是棘手的部分。 – seekingStillness

+0

它只会在通货膨胀的时候动画,而不是在那之后动画。 –

+0

谢谢,我会试试! – seekingStillness

0

如果您使用此RecyclerView提供的Activity它的代码将是有益的。无论如何,this answer将有助于您检测您的RecyclerView是否已达到最后一项。
this answer将帮助您检测您的布局是否完全创建/充气。

+0

我不想定位最后一项,我想定位RecyclerView *已经完成充气*。这将是一个更小的数字。 – seekingStillness

+0

您的要求是当'RecyclerView'开始创建/膨胀时开始动画,并在完成时停止动画。我对吗? 为了正确理解你目前在使用'RecyclerView'做什么,你还必须提供代码在哪里使用这个rec​​yclerView(即你的'活动') –

+0

无论如何,[这个答案](http: //stackoverflow.com/a/31854673/2788613)可能仍然有帮助。这包含在布局完全加载/膨胀时调用的侦听器。 –