单击按钮后在 recyclerview 中动画单个视图
Animate single view in recyclerview after button click
我有一个按钮和一个回收站视图。该按钮刷新列表。我想在更新时为回收站视图中的其中一个文本视图设置动画。不是整个 recyclerview,不是整行 - 只有一个视图(每一行)。
我尝试将动画放在 onBindViewHolder 中。但这会在滚动时启动动画,当我添加列表条目时:
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
Animation animation = AnimationUtils.loadAnimation(context, R.anim.rv_animation_clockwise);
((ViewHolderItem)holder).tv.startAnimation(animation);
然后我尝试将 TextChangedListener 添加到我的文本视图中。但这与直接放入 onBindViewHolder 具有相同的效果:
((ViewHolderItem)holder).tv.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
我最后一次尝试是使用 findViewHolderForAdapterPosition。但它什么也没做。
这是我的按钮调用的刷新方法。它在 RecyclerViewAdapter 中。
recyclerview 是我在 onAttachedToRecyclerView:
中设置的一个实例变量
RecyclerView recyclerView;
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
this.recyclerView = recyclerView;
}
void refresh (List<Entry> al){
this.al = al;
notifyDataSetChanged();
((ViewHolderItem)recyclerView.findViewHolderForAdapterPosition(0)).tv.startAnimation(animation);
颠簸
您应该实现自己的 ItemAnimator 并将其设置为您的 RecyclerView。这里有一些有用的信息:https://hackmd.io/@nesquena/r1IEQ-jAl?type=view
谢谢,我稍后会查看 ItemAnimator。
我昨天最后做的是在我的 adapter.refresh() 和动画之间添加一个小的延迟。就像他们建议的那样 。奇怪的是,这种延迟似乎是必要的,即使 notifyDataSetChanged();在动画之后被调用。我不认为这是一个很好的解决方案,但它现在有效。
final Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rv_animation_clockwise);
recyclerView.postDelayed(new Runnable()
{
@Override
public void run()
{
for (int i = 0; i < al.size(); i++) {
if (recyclerView.findViewHolderForAdapterPosition(i)!=null) {
((RecyclerViewAdapter.ViewHolderItem) recyclerView.findViewHolderForAdapterPosition(i)).tv.startAnimation(animation);
}
}
}
},50);
我有一个按钮和一个回收站视图。该按钮刷新列表。我想在更新时为回收站视图中的其中一个文本视图设置动画。不是整个 recyclerview,不是整行 - 只有一个视图(每一行)。
我尝试将动画放在 onBindViewHolder 中。但这会在滚动时启动动画,当我添加列表条目时:
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
Animation animation = AnimationUtils.loadAnimation(context, R.anim.rv_animation_clockwise);
((ViewHolderItem)holder).tv.startAnimation(animation);
然后我尝试将 TextChangedListener 添加到我的文本视图中。但这与直接放入 onBindViewHolder 具有相同的效果:
((ViewHolderItem)holder).tv.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
我最后一次尝试是使用 findViewHolderForAdapterPosition。但它什么也没做。 这是我的按钮调用的刷新方法。它在 RecyclerViewAdapter 中。 recyclerview 是我在 onAttachedToRecyclerView:
中设置的一个实例变量RecyclerView recyclerView;
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
this.recyclerView = recyclerView;
}
void refresh (List<Entry> al){
this.al = al;
notifyDataSetChanged();
((ViewHolderItem)recyclerView.findViewHolderForAdapterPosition(0)).tv.startAnimation(animation);
颠簸
您应该实现自己的 ItemAnimator 并将其设置为您的 RecyclerView。这里有一些有用的信息:https://hackmd.io/@nesquena/r1IEQ-jAl?type=view
谢谢,我稍后会查看 ItemAnimator。
我昨天最后做的是在我的 adapter.refresh() 和动画之间添加一个小的延迟。就像他们建议的那样
final Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rv_animation_clockwise);
recyclerView.postDelayed(new Runnable()
{
@Override
public void run()
{
for (int i = 0; i < al.size(); i++) {
if (recyclerView.findViewHolderForAdapterPosition(i)!=null) {
((RecyclerViewAdapter.ViewHolderItem) recyclerView.findViewHolderForAdapterPosition(i)).tv.startAnimation(animation);
}
}
}
},50);