2017-09-15 12 views
0

私は3種類のitemviewtypeを持つリサイクラーアダプターを持っています。 No.1タイプのビューには、ホルダーインスタンスチェックの下で書いたビューを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(FeatureNotificationViewHolder instanceofのホルダー){ 最終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()あなたのアダプタインスタンスに.notifyItemChanged(int position)方法を使用することを検討してリセットするためにすべてをしたくない場合は、RecyclerView内のアイテムのすべてを通知します。あなたは、通知されるアイテムのインデックス/位置を正確に知る必要があります。

+1

素晴らしいです。おかげでたくさん – L3G3NDj

+0

あなたは大歓迎です。 Btw、stackoverflow上で、あなたがそれをアップヴォートする答えが好きなら、答えが正しい場合は、左に 'tick'で正しいとマークします。 –

0

notifyDataSetChangedを使用する代わりに、notifyItemChangedを使用して、アダプタまたはデータセット全体ではなく、変更が必要な項目のみを変更する必要があります。

特定のアイテムだけを変更しているため、これで不必要なアニメーションになることはありません。これはまた、はるかに高速であり、処理およびレンダリングのパワーを抑えることができます。

詳しくはhereをご覧ください。

関連する問題