我正在尝试以编程方式为所有RecyclerView项设置显示时的输入动画。
我可以使用XML动画文件成功地制作动画:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recycler.layoutManager = LinearLayoutManager(this)
recycler.adapter = MyAdapter()
recycler.layoutAnimation = AnimationUtils.loadLayoutAnimation(this, R.anim.layout_animation_from_right)
//recycler.itemAnimator = SimpleItemAnimator()
recycler.adapter!!.notifyDataSetChanged()
recycler.scheduleLayoutAnimation()
}
}
这个解决方案工作得很好,但是我需要使用类扩展DefaultItemAnimator来设置动画。
为此,我创建了SimpleItemAnimator类并重写其animateApperance方法:
public class SimpleItemAnimator extends DefaultItemAnimator {
@Override
public boolean animateAppearance(@NonNull RecyclerView.ViewHolder viewHolder, @Nullable ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) {
Log.d("AnimationTag", "animateApperance");
final MyAdapter.SampleViewHolder holder = (MyAdapter.SampleViewHolder) viewHolder;
ObjectAnimator animator = ObjectAnimator.ofFloat(holder.mTextView, View.TRANSLATION_X, 0, holder.mTextView.getWidth() / 2);
animator.setDuration(2000);
animator.start();
return super.animateAdd(viewHolder);
}
}
然后我将其设置为RecyclerView:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recycler.layoutManager = LinearLayoutManager(this)
recycler.adapter = MyAdapter()
// recycler.layoutAnimation = AnimationUtils.loadLayoutAnimation(this, R.anim.layout_animation_from_right)
recycler.itemAnimator = SimpleItemAnimator()
recycler.adapter!!.notifyDataSetChanged()
recycler.scheduleLayoutAnimation()
}
}
结果项没有设置动画,在日志中我找不到“animateApperance”,这意味着没有调用此方法。
我的问题:如何使用DefaultItemAnimator以编程方式设置RecyclerView项的动画?
顺便说一下,这是MyAdapter的代码:
public class MyAdapter extends RecyclerView.Adapter {
static class SampleViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public SampleViewHolder(TextView textView) {
super(textView);
mTextView = textView;
}
}
@NonNull
@Override
public SampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
TextView textView = (TextView) LayoutInflater.from(parent.getContext()).inflate(R.layout.listitem, parent, false);
return new SampleViewHolder(textView);
}
@Override
public void onBindViewHolder(@NonNull SampleViewHolder sampleViewHolder, int i) {
sampleViewHolder.mTextView.setText("item "+i);
}
@Override
public int getItemCount() {
return 5;
}
}