CustomAdapter заставляет анимацию работать не плавно

У меня была эта проблема в течение долгого времени, и после нескольких часов попыток найти решение я решил попробовать и попросить совета здесь.

У меня есть фрагмент, который в основном представляет собой календарь. Он состоит из GridView, который заполняет адаптер (он также выделяет дни, в которые есть данные в базе данных SQLite). Основная проблема в том, что при установке этого адаптера он "замораживает" экран на несколько сотен миллисекунд и делает анимацию не плавной.

Примером того, что анимация не работает гладко, является случай, когда я нажимаю кнопку в SlidingMenu (jfeinstein10). Когда я нажимаю кнопку, которая заменяет текущий фрагмент фрагментом календаря, анимация выдвижения SlidingMenu не работает плавно. После долгих поисков виновника я обнаружил, что это происходит, когда я устанавливаю адаптер в GridView (gridview.setAdapter(adapter);)

Я уже пробовал с AsyncTask безрезультатно.

Итак, мой вопрос: как настроить адаптер таким образом, чтобы он не влиял на анимацию слайдов, которая возникает во время его установки?

Некоторый код фрагмента календаря для справки:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    context = getActivity();

    month = (GregorianCalendar) GregorianCalendar.getInstance();
    month.setFirstDayOfWeek(GregorianCalendar.MONDAY);
    itemmonth = (GregorianCalendar) month.clone();

    items = new ArrayList<String>();
    adapter = new CalendarAdapter(context, month);

    gridview = (GridView) view.findViewById(R.id.calendarGridView);
    gridview.setAdapter(adapter);

    handler = new Handler();
    handler.post(calendarUpdater);

    title = (TextView) view.findViewById(R.id.currentMonthTextView);
    title.setText(android.text.format.DateFormat.format("MMMM yyyy", month));

    previous = (Button) view.findViewById(R.id.prevMonthButton);

    previous.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            setPreviousMonth();
            refreshCalendar();
        }
    });

    [the code continues but I don't think it's relevant]
}

Когда я подавляю строку gridview.setAdapter(adapter);, она работает гладко, так что это должно быть проблемой.

В фрагменте меню:

@Override
public void onClick(View v) {
    Fragment newContent = null;
    switch (v.getId()) {
    case R.id.homeButton:
        newContent = new TabFragment1();
        break;
    case R.id.diaryButton:
        newContent = new TabFragment1();
        break;
    case R.id.calendarButton:
        newContent = new TabFragment2();
        break;
    case R.id.statsButton:
        newContent = new StatsFragment();
        break;
    }

    if (newContent != null)
        switchFragment(newContent);
        updateSelector(v);

}

private void switchFragment(Fragment fragment) {
    if (getActivity() == null)
        return;

    if (getActivity() instanceof Main) {
        Main mainAct = (Main) getActivity();
        mainAct.switchContent(fragment);
    }
}

В основной деятельности:

public void switchContent(Fragment fragment) {
    mContent = fragment;
    getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.content_frame, fragment)
    .commit();
    getSlidingMenu().showContent();
}

Эта проблема делает пользовательский опыт очень плохим, поэтому, пожалуйста, если у вас есть какие-либо идеи, дайте мне знать.


person user2925084    schedule 14.03.2014    source источник
comment
вы использовали трассировку?   -  person pskink    schedule 15.03.2014
comment
Где именно? В любом случае я пришел к решению, переопределив метод onCreateAnimation во фрагменте и установив адаптер в методе onAnimationEnd   -  person user2925084    schedule 15.03.2014


Ответы (1)


Я пришел к решению. Я переопределил метод onCreateAnimation фрагмента и установил адаптер внутри метода onAnimationEnd анимации. Так:

@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {

    Animation anim;
    if (enter) {
        anim = AnimationUtils.loadAnimation(getActivity(), R.anim.fade_in);
    } else {
        anim = AnimationUtils.loadAnimation(getActivity(), R.anim.fade_out);
    }

    anim.setAnimationListener(new AnimationListener() {
        public void onAnimationEnd(Animation animation) { 
            gridview.setAdapter(adapter);
        }

        public void onAnimationRepeat(Animation animation) { }

        public void onAnimationStart(Animation animation) { }
    });

    return anim;
}

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

person user2925084    schedule 15.03.2014