1

我试图在活动页面上实现一个包含列表和其下一些其他视图的ToDo列表。Android RecyclerView删除项目动画错误

我使用整个页面LinearLayout和列表中RecyclerView,下面一起其他视图RecyclerViewImageViewButtons ...等)

这是我最后的视图层次:

<LinearLayout> 
    <TextView /> 
    <RecyclerView /> 
    <Button /> 
    <EditText /> 
    <ImageView /> 
</LinearLayout> 

我已经实施RecyclerView我可以添加和删除项目。 我在使用LinearLayoutManager而未指定ItemAnimator,因此使用了DefaultItemAnimator

将项目添加到列表中可按预期工作。我的问题是,当RecyclerView删除项(通过先从数据集中删除它,然后使用RecyclerViewAdapter.notifyItemRemoved),页面不能很好地动画。

什么情况是,整个页面捕捉第一,以适应新的RecyclerView高度,然后RecyclerView项目中删除动画完成,这使得页面的行为看起来很怪异,因为RecyclerView下面的所有意见抢购而被删除的项目淡出,但尚未失去其高度,然后剩下的RecyclerView项(在删除的项目下方)向上滚动,看起来像从墙下向上滑动。

我试图寻找网络上的解决方案,并找不到任何解决我的问题。

我发现this unanswered question描述了同样的问题。如果我的解释不够清楚,请参考它。

任何人遇到同样的问题?有什么建议么?

谢谢。

+0

所以你想删除动画时项目变化的权利? –

+0

而不是使用notifyDataSetChanged(),请使用notifyItemRemoved()。 NotifyDataSetChanged重建RecyclerView中的整个数据集,所以所有的行都被重绘。而notifyItemRemoved()或notifyItemRangeChanged()只会刷新已更改的项目,所以生涩的议案将消失。 – Rachit

+0

@Divyesh我不想删除动画,我只是希望整个页面在我从RecyclerView中删除一个项目时动画很好。我的意思是我希望页面在翻译之前等待RecyclerView项目动画完成。 – Copy33

回答

1

试试这一个,并检查它是否正在工作,你的期望:

recyclerView.setHasFixedSize(true); 
recyclerView.setItemAnimator(new MyAnim()); 


public static class MyAnim extends RecyclerView.ItemAnimator { 
     @Override 
     public boolean animateDisappearance(@NonNull RecyclerView.ViewHolder viewHolder, @NonNull ItemHolderInfo preLayoutInfo, @Nullable ItemHolderInfo postLayoutInfo) { 
      return false; 
     } 

     @Override 
     public boolean animateAppearance(@NonNull RecyclerView.ViewHolder viewHolder, @Nullable ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) { 
      return false; 
     } 

     @Override 
     public boolean animatePersistence(@NonNull RecyclerView.ViewHolder viewHolder, @NonNull ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) { 
      return false; 
     } 

     @Override 
     public boolean animateChange(@NonNull RecyclerView.ViewHolder oldHolder, @NonNull RecyclerView.ViewHolder newHolder, @NonNull ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) { 
      final float prevAlpha = ViewCompat.getAlpha(oldHolder.itemView); 

      ViewCompat.setAlpha(oldHolder.itemView, prevAlpha); 

      ViewCompat.setAlpha(newHolder.itemView, 0); 

      return true; 
     } 

     @Override 
     public void runPendingAnimations() { 

     } 

     @Override 
     public void endAnimation(RecyclerView.ViewHolder item) { 

     } 

     @Override 
     public void endAnimations() { 

     } 

     @Override 
     public boolean isRunning() { 
      return false; 
     } 
    } 
+0

这没有奏效。问题不在于RecyclerView项目本身的动画,问题在于页面如何处理RecyclerView下的所有其他项目...第二个我删除一个项目RecyclerView捕捉下面的所有视图,以适应新的RecyclerView计算高度(删除项目后)在该项目的删除动画完成之前。 – Copy33

1

我有同样的问题。在我的情况下,这条线帮助:

recyclerView.setHasFixedSize(true);