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