简体   繁体   English

Android中RecyclerView的项目动画

[英]Item animation of RecyclerView in android

I had a problem when i use animation in RecyclerView, i want to start a TranslateAnimation on a RelativeLayout of all items and setFillAfter(true) to keep the animation when it end, everything looks like good when animation start, but when i scroll the RecyclerView something appear like below: 我在RecyclerView中使用动画时遇到问题,我想在所有项目的RelativeLayout上启动TranslateAnimation并使用setFillAfter(true)来结束动画,动画开始时一切看起来都很好,但是当我滚动RecyclerView时如下所示:

[ [ 1]

some item's animation lost: 某些物品的动画丢失了:

[ [ 2]

Here is my code: 这是我的代码:

public class MainActivity extends Activity {
private static final List<Model> DATA = Model.getModels();
private List<RelativeLayout> layouts = new ArrayList<>();

@InjectView(R.id.recycler_view)
RecyclerView recyclerView;
@InjectView(R.id.main_edit_btn)
Button btnEdit;

private MainAdapter adapter;

private boolean isEdit;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.ac_main);
    ButterKnife.inject(this);
    recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
    adapter = new MainAdapter();
    recyclerView.setAdapter(adapter);
}

@OnClick(R.id.main_all_btn)
public void selectAll() {

}

@OnClick(R.id.main_del_btn)
public void delete() {

}

@OnClick(R.id.main_edit_btn)
public void edit() {
    if (isEdit) {
        btnEdit.setText("Edit");
        isEdit = false;
        for (Model model : DATA) {
            model.isEdit = false;
        }
    } else {
        btnEdit.setText("Cancel");
        isEdit = true;
        for (Model model : DATA) {
            model.isEdit = true;
        }
    }
    adapter.notifyDataSetChanged();
}

class MainAdapter extends RecyclerView.Adapter<MainAdapter.MainHolder> {
    @Override
    public MainHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new MainHolder(LayoutInflater.from(MainActivity.this)
                .inflate(R.layout.ac_main_item, parent, false));
    }

    @Override
    public void onBindViewHolder(MainHolder holder, int position) {
        holder.tvTitle.setText(DATA.get(position).title);
        holder.tvDate.setText(DATA.get(position).date);
        if (DATA.get(position).isEdit) {
            holder.startAnim();
        }
    }

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

    class MainHolder extends RecyclerView.ViewHolder {
        @InjectView(R.id.main_item_title_tv)
        TextView tvTitle;
        @InjectView(R.id.main_item_date_tv)
        TextView tvDate;
        @InjectView(R.id.main_item_content_rl)
        RelativeLayout rlContent;

        public MainHolder(View itemView) {
            super(itemView);
            ButterKnife.inject(this, itemView);
        }

        public void startAnim() {
            Animation anim = new TranslateAnimation(0, 100, 0, 0);
            anim.setDuration(500);
            anim.setFillEnabled(true);
            anim.setFillAfter(true);
            rlContent.startAnimation(anim);
        }
    }
}

} }

Is anyone can help me how to solve this problem?thx. 有谁能帮助我解决这个问题?

My guess is that that view is finished being bound before it is visible on screen, stopping the animation from running. 我的猜测是该视图在屏幕上可见之前就已经完成绑定,从而停止了动画的运行。 The animation is also quite jarring while the list is moving. 列表移动时动画也很震撼。 It would probably be a better idea to only animate the views when the list isn't moving. 仅在列表不移动时为视图设置动画可能是一个更好的主意。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM