2017-09-15 52 views
0

我有一個有3個itemviewtypes的回收站適配器。第一種類型的視圖有一個初始動畫來顯示我在OnBindView的持有者實例檢查下寫的視圖。它工作正常。但是當其他視圖類型有任何更改時,將調用notifydatasetchanged(),並重新設置適配器,使動畫重新開始。 我試圖把動畫的標誌放在第一次動畫的地方。有沒有更聰明的方法來做到這一點?在調用notifydatasetchanged()後保持Recyclerview中視圖的狀態不變()

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int 
    viewType) { 

mSharedPreferencesManager.setVersionNewFeatureCheck(BuildConfig.VERSION_NAME); 

    Logger.i(TAG, "onCreateViewHolder, " + viewType); 

    if (viewType == TYPE_HEADER) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.converation_header_row, parent, false); 
     return new HeaderViewHolder(v); 
    } else if(viewType == TYPE_ANNOUNCEMENT) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_new_feature_notification, parent, false); 
     return new FeatureNotificationViewHolder(v); 
    } 
     else{ 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.conversation_row, parent, false); 
     return new ConversationRowViewHolder(v); 
    } 
} 

F(的instanceof FeatureNotificationViewHolder持有者){ 最終FeatureNotificationViewHolder featureNotificationViewHolder =(FeatureNotificationViewHolder)保持器;

   featureNotificationViewHolder.chatNewFeatureNotif.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
        @Override 
        public boolean onPreDraw() { 

         final int height = featureNotificationViewHolder.chatNewFeatureNotif.getMeasuredHeight(); 
         featureNotificationViewHolder.chatNewFeatureNotif.setVisibility(View.GONE); 
         featureNotificationViewHolder.chatNewFeatureNotif.getViewTreeObserver().removeOnPreDrawListener(this); 
         mOverflowAnimations.showView(featureNotificationViewHolder.chatNewFeatureNotif, height, 6); 

         return false; 
        } 
       }); 
+0

你可以添加你使用的代碼嗎? –

回答

0

.notifyDataSetChanged()會通知你所有的項目RecyclerView裏面的,如果你不想要的一切重新考慮使用.notifyItemChanged(int position)方法在你的適配器實例。您需要確切地知道要通知的項目的索引/位置。

+1

太棒了。非常感謝 – L3G3NDj

+0

不客氣。順便說一句,在stackoverflow上,如果你喜歡答案你upvote它,如果答案是正確的,你用左邊的'tick'標記它是正確的。 –

0

而不是使用notifyDataSetChanged,您應該使用notifyItemChanged只更改需要更改的項目,而不是整個適配器或數據集。

這不會導致不必要的動畫,因爲您只更改特定的項目。這也快得多,並且佔用較少的處理和渲染能力。

您可以閱讀更多關於它here

相關問題