奇妙で奇妙ですが、フラグメントトランザクションのアニメーション化に使用する ObjectAnimator に AnimatorListener をアタッチすると、アニメーションが終了する少し前にコールバックが実際に呼び出されるようです。リスナーを使用して、(DB から) フラグメントにコンテンツを取り込みます。操作には非常に長い時間がかかる場合があり (~200ms)、onCreate などで実行すると、アニメーション中にコンテンツが返されてレンダリングされるため、アニメーションが破壊されるだけです。 . したがって、populate 呼び出しをリスナーに追加すると、DB 選択にも時間がかかる場合に機能します。しかし、時にはそれはほぼ瞬時に発生し、その場合、アニメーションの終了前にコールバックが呼び出されると問題が発生します。
この問題を解決する方法を知っていますか?以下は、そのフラグメントのほぼ全体のコードです。
したがって、基本的にこの問題を解決するには 2 つの方法があります。ジャンクなアニメーションを使用せずにコンテンツをフラグメントに取り込む方法とはまったく別の解決策を見つけることができます。または、リスナーの問題を解決する方法を見つけることができます。
そして、私が気に入らない方法がもう 1 つあります。Handler を作成し、postDelayed..awful ソリューションを呼び出すことができます:)
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);
}
}