Анимация добавления и удаления элемента в 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;}
}