ObjectAnimator onAnimationEnd прослушиватель вызывается перед завершением анимации

Это странно и странно, но похоже, что когда я присоединяю AnimatorListener к ObjectAnimator, который я использую для анимации транзакций фрагментов, обратный вызов фактически называется немного до завершения анимации. Я использую прослушиватель для заполнения содержимого во фрагменте (из базы данных). Операция может занимать довольно много времени (~ 200 мс), иногда, когда я делаю это в onCreate или так, она просто разрушает анимацию, потому что содержимое возвращается и отображается во время анимации … тогда есть много мусора и заикания. Поэтому, когда я добавляю заполненный вызов в слушатель, он работает, когда выбор БД занимает много времени. Но иногда это почти мгновенно, и в этом случае у меня проблема, когда обратный вызов вызывается до конца анимации. Разрыв между обратным вызовом и концом экстента является длинным, чтобы вернуть данные из БД и снова уничтожить текучесть анимации: /

Вы, ребята, знаете, как решить эту проблему? Ниже приведен почти весь код этого фрагмента.

Таким образом, существует два способа решения этой проблемы. Я могу найти совершенно другое решение, как заполнить содержимое фрагментом без junky-анимации, или я могу найти способ решения проблемы с прослушивателем.

И есть один дополнительный способ, который мне не нравится. Я могу создать обработчик и вызвать postDelayed..awful solution 🙂

public class ImportantContactsFragment extends Fragment { public static final String TAG = ImportantContactsFragment.class.getSimpleName(); private ListView list; private Spinner departmentsSwitcher; private Spinner facultiesSwitcher; private ContactsAdapter adapter; private ArrayList<ImportantContact> currentListOfPeople; private int currentFaculty = 1; private Department currentDeparment = Department.STUDY_DEPARTMENT; private PullToRefreshAttacher mPullToRefreshAttacher; private boolean boot = true; private AsyncTask<Integer, ArrayList<ImportantContact>, ArrayList<ImportantContact>> task; private ArrayList<Faculty> faculties; private SpinnerAdapter departmentsSpinnerAdapter; private SpinnerAdapter facultiesSpinnerAdapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { currentListOfPeople = new ArrayList<ImportantContact>(); faculties = new ArrayList<Faculty>(2); currentDeparment = Department.STUDY_DEPARTMENT; faculties.add(Faculty.getFEL()); faculties.add(Faculty.getFIT()); FrameLayout view = (FrameLayout) inflater.inflate(R.layout.important_contacts_fragment_list_layout, container, false); departmentsSwitcher = (Spinner) view.findViewById(R.id.departmentsSpinner); facultiesSwitcher = (Spinner) view.findViewById(R.id.facultiesSpinner); facultiesSpinnerAdapter = new ArrayAdapter<Faculty>(getActivity(), R.layout.spinner_text_view, faculties); departmentsSpinnerAdapter = new ArrayAdapter<Department>(getActivity(), R.layout.spinner_text_view, Department.values()); departmentsSwitcher.setAdapter(departmentsSpinnerAdapter); facultiesSwitcher.setAdapter(facultiesSpinnerAdapter); list = (ListView) view.findViewById(R.id.list); adapter = new ContactsAdapter(getActivity(), R.layout.important_contacts_list_item, currentListOfPeople, list); list.setAdapter(adapter); list.requestFocus(); departmentsSwitcher.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { currentDeparment = (Department) departmentsSpinnerAdapter.getItem(position); fillAdapterWithData(currentFaculty, currentDeparment); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); facultiesSwitcher.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { currentFaculty = position + 1; fillAdapterWithData(currentFaculty, currentDeparment); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); return view; } @Override public void onResume() { super.onResume(); Tracking.onResume(this); // fillAdapterWithData(currentFaculty, currentDeparment); } @Override public void onPause() { super.onPause(); if (task != null) { task.cancel(true); } } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getActivity().getActionBar().setTitle(getString(R.string.important_contacts)); } public void fillAdapterWithData(int facultyId, Department department) { if (boot) { boot = false; return; } currentListOfPeople.clear(); if (task != null) { task.cancel(true); } task = new AsyncTask<Integer, ArrayList<ImportantContact>, ArrayList<ImportantContact>>() { @Override protected ArrayList<ImportantContact> doInBackground(Integer... params) { return Controller.peopleDBController.getListOfImportantContactFromListOfContact(Controller.contactsDBController.searchRows(params[0], params[1])); } @Override protected void onPostExecute(ArrayList<ImportantContact> importantContacts) { // adapter.notifyDataSetChanged(); adapter.addAll(importantContacts); } }; // getActivity().setProgressBarVisibility(true); task.execute(facultyId, department.ordinal()); adapter.addAll(Controller.peopleDBController.getListOfImportantContactFromListOfContact(Controller.contactsDBController.searchRows(facultyId, department.ordinal()))); } @Override public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) { if(enter){ Animator animator = AnimatorInflater.loadAnimator(getActivity(), R.anim.fragment_slide_anim); if(animator!=null){ animator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { // fillAdapterWithData(currentFaculty, currentDeparment); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); } return animator; } else{ return super.onCreateAnimator(transit, enter, nextAnim); } } 

Solutions Collecting From Web of "ObjectAnimator onAnimationEnd прослушиватель вызывается перед завершением анимации"