2017-09-15 174 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

相关问题