如何使用回收站视图创建浮动操作按钮菜单行为?

时间:2017-01-23 14:20:57

标签: android animation android-recyclerview

我希望在添加回收器视图项时为其设置动画。不是我滚动,或者是在添加项目之后。我试图模仿的行为类似于你有一个FloatingActionMenu并且你将FloatingActionButtons添加到该菜单。菜单打开,逐个显示项目。我该如何完成这个行为?我没有使用FloatingActionMenu或FloatingActionButtons,因为我想膨胀更复杂的视图。如您所见,这些菜单受限制

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

我尝试在onBindViewHolder中添加动画,但为时已晚。所有项目同时添加,动画全部同时发生,而不是顺序发生。想到的唯一想法是逐个添加项目到适配器,并且utalize 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);

1 个答案:

答案 0 :(得分: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进行更新。首先,我颠倒了布局,并将堆栈设置为从end到false。这允许所需的效果类似于从下到上打开的浮动操作按钮。

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