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);