CustomAdapter使动画运行不顺畅

时间:2014-03-14 21:25:30

标签: android animation android-fragments smooth

我已经有很长一段时间遇到这个问题了,经过几个小时的努力寻找解决方案,我决定尝试在这里寻求一些建议。

我有一个基本上是日历的片段。它由一个适配器填充的GridView组成(它还突出显示SQLite数据库中包含数据的日子)。主要问题是,当设置此适配器时,它会将屏幕“冻结”几个小时,并使动画不平滑。

动画运行不顺畅的一个例子是当我点击SlidingMenu(jfeinstein10)中的一个按钮时。当我单击一个用Calendar 1替换当前片段的按钮时,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);行时,它会顺利运行,因此一定是问题所在。

在MenuFragment中:

@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();
}

这个问题会让用户真的很难过,所以如果您有任何想法请告诉我。

1 个答案:

答案 0 :(得分:0)

我已经找到了解决方案。我已经覆盖了片段的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;
}

这样片段具有淡入和淡出动画,其持续时间与幻灯片相同或更多,因此当设置适配器时,没有动画运行,因此动画运行顺利。