2017-01-23 31 views
1

我想在回收商查看物品时添加动画。不是当我滚动,或者在项目被添加之后。我试图模仿的行为与当您有FloatingActionMenu并将FloatingActionButtons添加到该菜单时类似。菜单打开,逐个显示项目。我如何完成这种行为?我没有使用FloatingActionMenu或FloatingActionButtons,因为我想膨胀更复杂的视图。正如你可以看到,这些菜单被限制如何使用回收站视图创建浮动操作按钮菜单行为?

https://forum.ionicframework.com/uploads/default/original/1/3/130fe3336b32906959f2ab00e71c276c5acc9ca4.jpg

我曾尝试在onBindViewHolder添加动画,但这是为时已晚。所有项目都在同一时间添加,动画全部同时发生,而不是按顺序发生。想到的唯一想法是将项目逐个添加到适配器,并对notifyDataSet进行更改,但我想挑选社区的大脑来查看是否有更好的方法。这里是我的适配器

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 

    private final static int FADE_DURATION = 10000; // in milliseconds 
    private Context mContext; 
    private String[] mContent; 

    public MyAdapter(Context context, String[] content) { 
     mContext = context; 
     mContent = content; 
    } 

    @Override 
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.items, parent, false)); 
    } 

    @Override 
    public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) { 
     holder.tvText.setText(mContent[position]); 
     // Set the view to fade in 
     setScaleAnimation(holder.itemView); 
    } 

    @Override 
    public int getItemCount() { 
     return mContent.length; 
    } 

    private void setFadeAnimation(View view) { 
     AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f); 
     anim.setDuration(FADE_DURATION); 
     view.startAnimation(anim); 
    } 

    private void setScaleAnimation(View view) { 
     ScaleAnimation anim = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, 
       Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 
     anim.setDuration(FADE_DURATION); 
     view.startAnimation(anim); 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 

     private TextView tvText; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      tvText = (TextView) itemView.findViewById(R.id.tv_text); 
     } 
    } 
} 

这是我如何初始化和将数据发送到我的适配器

LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
    layoutManager.setReverseLayout(true); 
    layoutManager.setStackFromEnd(true); 
    rv.setLayoutManager(layoutManager); 
    mAdapter = new MyAdapter(mContext, mContent); 
    rv.setAdapter(mAdapter); 

我曾尝试一些其他的事情是控制项目的时间,因为他们加入。我尝试使用setItemAnimator,然后设置项目的addDuration。没有一个按预期工作。

LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
    layoutManager.setReverseLayout(true); 
    layoutManager.setStackFromEnd(true); 
    rv.setLayoutManager(layoutManager); 
    mAdapter = new MyAdapter(mContext, mContent); 
    DefaultItemAnimator animation = new DefaultItemAnimator(); 
    animation.setAddDuration(100000); // << this attribute seems to make no difference 
    rvItems.setItemAnimator(animation); 
    rv.setAdapter(mAdapter); 
+0

你可能想创建一个['ItemAnimator'(https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ItemAnimator.html)。请注意,您不必从头开始,它可能足以扩展该页面上列出的现有子类之一。 – Karakuri

+0

@Karakuri itemAnimator似乎只适用于可滚动项目。所以当我滚动时,滚动时添加的第一个项目上发生的动画。我需要拦截项目,然后才能添加和绑定。 – portfoliobuilder

+0

我不知道你的意思是“可滚动”的物品。文档建议可以动画添加,移动,更改和删除项目。 – Karakuri

回答

0

对于任何人想知道这是如何可能的,我想出了一个使用处理程序的解决方案。基本上,你想要逐个插入项目。你的处理程序是允许这种情况发生的。

 final Handler handler = new Handler(); 
     final Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
       mItemCounter++; 
       ArrayList<Model> temp = new ArrayList<>(); 
       for (int i = 0; i < mItemCounter; i++) { 
        if (i < Model.description.size()) { 
         temp.add(Model.description.get(i)); 
        } 
       } 

       if (mItemCounter < Model.description.size()) { 
        if (mItemCounter == 1) { 
         mAdapter = new MyAdapter(mContext, temp); 
         rv.setAdapter(mAdapter); 
        } else { 
         mAdapter.insert((mItemCounter - 1), temp.get(mItemCounter - 1)); 
        } 
        handler.postDelayed(this, 150); 
       } 
      } 
     }; 
     handler.postDelayed(runnable, 175); 

将插入方法添加到您的适配器,以便您可以顺序地逐个添加项目。

public void insert(int position, Model model) { 
    mModel.add(position, model); 
    notifyItemInserted(position); 
} 

设置的其余部分取决于你想要做什么。我想让我的菜单从下往上打开,所以我还必须更新LayoutManager。首先,我颠倒了布局,并将堆栈从结尾设置为假。这可以实现类似于从下往上打开的浮动动作按钮的所需效果。

rv = (RecyclerView) findViewById(R.id.rv); 
    LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    layoutManager.setReverseLayout(true); 
    layoutManager.setStackFromEnd(false); 
    rv.setLayoutManager(layoutManager); 
相关问题