Анимация добавления и удаления элемента в RecyclerView

Как добавить анимацию для добавления и удаления элементов в RecyclerView? Пробовал использовать DiffUtil в своём Adapter, но не получается, список просто перестает отображаться. Помогите решить проблему.

Fragment с RecyclerView, сейчас я использую Adapter с названием AdapterSkatingRinkSchedule_3, в котором использовал DiffUtil, но список, как я уже писал, не отображается.

public class FragmentRink extends Fragment  {
    private RecyclerView mRec_srs;
    private AdapterSkatingRinkSchedule adapter_srs;
    private ArrayList<ItemSkatingRinkSchedule> exampleList;

    private RecyclerView.LayoutManager mLayoutManager;

    List<ItemSkatingRinkSchedule_2> mSkatingRinkScheduleList;

    RecyclerView recyclerView;
    RecyclerView.LayoutManager recyclerViewlayoutManager;
    RecyclerView.Adapter recyclerViewadapter;
    String HTTP_JSON_URL = "";
    String GET_JSON_FROM_SERVER_NUMBER = "session_number";
    String GET_JSON_FROM_SERVER_START = "session_start";
    String GET_JSON_FROM_SERVER_END = "session_end";
    String GET_JSON_FROM_SERVER_WEEKDAYS = "weekdays";
    String GET_JSON_FROM_SERVER_WEEKDAYS_AND_HOLIDAYS = "weekends_and_holidays";
    JsonArrayRequest jsonArrayRequest;
    RequestQueue requestQueue;
    View ChildView;
    int GetItemPosition;
    ArrayList<String> SubjectNames;


    private SwipeRefreshLayout mSwipeRefreshLayout;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        OnBackPressedCallback callback = new OnBackPressedCallback(true) {
            @Override
            public void handleOnBackPressed() {
                Intent homeIntent = new Intent(Intent.ACTION_MAIN);
                homeIntent.addCategory(Intent.CATEGORY_HOME);
                homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(homeIntent);
            }
        };

        requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_rink, container, false);
    }

    @Override
    public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {

        mSkatingRinkScheduleList = new ArrayList<>();
        recyclerView = requireView().findViewById(R.id.recy_srs);
        recyclerView.setHasFixedSize(true);
        recyclerViewlayoutManager = new LinearLayoutManager(getContext());
        recyclerView.setLayoutManager(recyclerViewlayoutManager);
        SubjectNames = new ArrayList<>();
        JSON_DATA_WEB_CALL();
        recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
            final GestureDetector gestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() {

                @Override
                public boolean onSingleTapUp(MotionEvent motionEvent) {
                    return true;
                }

            });

            @Override
            public boolean onInterceptTouchEvent(@NonNull RecyclerView Recyclerview, @NonNull MotionEvent motionEvent) {
                ChildView = Recyclerview.findChildViewUnder(motionEvent.getX(), motionEvent.getY());
                if (ChildView != null && gestureDetector.onTouchEvent(motionEvent)) {
                    GetItemPosition = Recyclerview.getChildAdapterPosition(ChildView);

                }
                return false;
            }

            @Override
            public void onTouchEvent(@NonNull RecyclerView Recyclerview, @NonNull MotionEvent motionEvent) {
            }

            @Override
            public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
            }
        });
        mSwipeRefreshLayout = requireView().findViewById(R.id.ref);
        mSwipeRefreshLayout.setOnRefreshListener(() -> {
            JSON_DATA_WEB_CALL();
            mSwipeRefreshLayout.setRefreshing(false);
        });
    }

    public void JSON_DATA_WEB_CALL() {
        jsonArrayRequest = new JsonArrayRequest(HTTP_JSON_URL,
                this::JSON_PARSE_DATA_AFTER_WEBCALL,
                error -> {
                });
        requestQueue = Volley.newRequestQueue(requireContext());
        requestQueue.add(jsonArrayRequest);
    }

    public void JSON_PARSE_DATA_AFTER_WEBCALL(JSONArray array) {

        mSkatingRinkScheduleList.clear();
        for (int i = 0; i < array.length(); i++) {
            ItemSkatingRinkSchedule_2 GetDataAdapter2 = new ItemSkatingRinkSchedule_2();
            JSONObject json;
            try {
                json = array.getJSONObject(i);
                GetDataAdapter2.set_session_number(json.getString(GET_JSON_FROM_SERVER_NUMBER));
                GetDataAdapter2.set_session_start(json.getString(GET_JSON_FROM_SERVER_START));
                GetDataAdapter2.set_session_end(json.getString(GET_JSON_FROM_SERVER_END));
                GetDataAdapter2.set_weekdays(json.getString(GET_JSON_FROM_SERVER_WEEKDAYS));
                GetDataAdapter2.set_weekends_and_holidays(json.getString(GET_JSON_FROM_SERVER_WEEKDAYS_AND_HOLIDAYS));
                SubjectNames.add(json.getString(GET_JSON_FROM_SERVER_NUMBER));
                SubjectNames.add(json.getString(GET_JSON_FROM_SERVER_START));
                SubjectNames.add(json.getString(GET_JSON_FROM_SERVER_END));
                SubjectNames.add(json.getString(GET_JSON_FROM_SERVER_WEEKDAYS));
                SubjectNames.add(json.getString(GET_JSON_FROM_SERVER_WEEKDAYS_AND_HOLIDAYS));
            } catch (JSONException e) {
                e.printStackTrace();
            }
            mSkatingRinkScheduleList.add(GetDataAdapter2);
        }
        recyclerViewadapter = new AdapterSkatingRinkSchedule_3();
        recyclerView.setAdapter(recyclerViewadapter);
    }
}

AdapterSkatingRinkSchedule_3

public class AdapterSkatingRinkSchedule_3 extends ListAdapter<ItemSkatingRinkSchedule_2, AdapterSkatingRinkSchedule_3.SkatingRinkScheduleViewHolder> {
    
    public AdapterSkatingRinkSchedule_3() {
        super(DIFF_CALLBACK);
    }

    private static final DiffUtil.ItemCallback<ItemSkatingRinkSchedule_2> DIFF_CALLBACK = new DiffUtil.ItemCallback<ItemSkatingRinkSchedule_2>() {
        @Override
        public boolean areItemsTheSame(ItemSkatingRinkSchedule_2 oldItem, ItemSkatingRinkSchedule_2 newItem) {
            return oldItem.get_session_number().equals(newItem.get_session_number());
        }
        @Override
        public boolean areContentsTheSame(ItemSkatingRinkSchedule_2 oldItem, ItemSkatingRinkSchedule_2 newItem) {
            return  oldItem.get_session_start().equals(newItem.get_session_start()) &&
                    oldItem.get_session_end().equals(newItem.get_session_end()) &&
                    oldItem.get_weekdays().equals(newItem.get_weekdays());
        }
    };

    @NonNull
    @Override
    public SkatingRinkScheduleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_srs, parent, false);
        return new SkatingRinkScheduleViewHolder(v);
    }

    public static class SkatingRinkScheduleViewHolder extends RecyclerView.ViewHolder {
        public TextView number_srs, start_time_srs, end_time_srs, cost_1_srs, cost_2_srs;
        public LinearLayout ll_main;

        public SkatingRinkScheduleViewHolder(View itemView) {
            super(itemView);
            ll_main = itemView.findViewById(R.id.ll_main);
            number_srs = itemView.findViewById(R.id.number_srs);
            start_time_srs = itemView.findViewById(R.id.start_time_srs);
            end_time_srs = itemView.findViewById(R.id.end_time_srs);
            cost_1_srs = itemView.findViewById(R.id.cost_1_srs);
            cost_2_srs = itemView.findViewById(R.id.cost_2_srs);
        }
    }

    @SuppressLint("LongLogTag")
    @Override
    public void onBindViewHolder(SkatingRinkScheduleViewHolder holder, int position) {
        ItemSkatingRinkSchedule_2 currentItem = getItem(position);
        holder.number_srs.setText(currentItem.get_session_number());
        holder.start_time_srs.setText(currentItem.get_session_start());
        holder.end_time_srs.setText(currentItem.get_session_end());
        holder.cost_1_srs.setText(currentItem.get_weekdays());
        holder.cost_2_srs.setText(currentItem.get_weekends_and_holidays());


        holder.ll_main.setOnClickListener(v -> {
            DialogSkatingRinkSchedule dialogSRS = new DialogSkatingRinkSchedule();
            dialogSRS.show(((AppCompatActivity) v.getContext()).getSupportFragmentManager(), "item");
            Bundle bundle = new Bundle();
            bundle.putString("number", currentItem.get_session_number());
            bundle.putString("start", currentItem.get_session_start());
            bundle.putString("end", currentItem.get_session_end());
            bundle.putString("w", currentItem.get_weekdays());
            bundle.putString("wah", currentItem.get_weekends_and_holidays());
            dialogSRS.setArguments(bundle);
        });
        holder.getAdapterPosition();
    }

}

ItemSkatingRinkSchedule_2 файл с структурой моих элементов

public class ItemSkatingRinkSchedule_2 implements Serializable {

    String mText_session_number,mText_session_start,mText_session_end,mText_weekdays,mText_weekends_and_holidays;

    public String get_session_number() {return mText_session_number;}
    public String get_session_start() {return mText_session_start;}
    public String get_session_end() {return mText_session_end;}
    public String get_weekdays() {return mText_weekdays;}
    public String get_weekends_and_holidays() {return mText_weekends_and_holidays;}

    public void set_session_number(String TempNumber) {this.mText_session_number = TempNumber;}
    public void set_session_start(String TempStart) {this.mText_session_start = TempStart;}
    public void set_session_end(String TempEnd) {this.mText_session_end = TempEnd;}
    public void set_weekdays(String TempWeekdays) {this.mText_weekdays = TempWeekdays;}
    public void set_weekends_and_holidays(String TempWAH) {this.mText_weekends_and_holidays = TempWAH;}
}

Ответы (0 шт):