添加视图会使片段中的ListView刷新

Rei*_*erd 4 android listview android-layout android-listview android-fragments

这可能有点难以解释,所以我能想到的最佳方式是为您提供一个显示问题的视频.

在视频中我展示自己滚动列表视图,并在5秒后,创建一个视图并添加到底部的持有者内部.在那一刻,listview被刷新.

http://tinypic.com/player.php?v=vpz0k8%3E&s=8#.U0VrIvl_t8E

问题如下:

我有一个活动,其布局包含:

  1. 片段(在RelativeLayout上方),匹配父,匹配父.
  2. RelativeLayout,作为包装内容.

该片段显示一个ListView,其中包含每行的动画.

如果我在"RelativeLayout"上添加一个View,它会使片段重新调整为新的大小,因为它设置在此RelativeLayout之上,因此每个Row都会重新重建.

你们想以任何方式避免这种情况吗?

编辑:源代码: https ://bitbucket.org/sergicast/listview-animated-buggy

Ema*_*lin 5

如果添加的页脚视图的布局过程正在运行,请不要启动动画.可以使用ViewTreeObserver确定布局过程的结束(开始显然从添加页脚视图开始):

    hand.postDelayed(new Runnable() {

        @Override
        public void run() {
            ViewTreeObserver viewTreeObserver = holder.getViewTreeObserver();
            viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
                @SuppressWarnings("deprecation")
                @Override
                public void onGlobalLayout() {
                    holder.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    mIgnoreAnimation = false;
                }
            });

            mIgnoreAnimation = true;
            holder.addView(viewToAdd);
        }
    }, 5000);
Run Code Online (Sandbox Code Playgroud)

将此方法添加到您的活动中:

public boolean ignoreAnimation() {
    return mIgnoreAnimation;
}
Run Code Online (Sandbox Code Playgroud)

并在你的片段中检查它:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Context context = FragmentTest.this.getActivity();

    TextView tv = new TextView(context);
    tv.setText("Pos: " + position);
    tv.setTextSize(35f);

    if (runAnimation()) {
        Animation anim = AnimationUtils.loadAnimation(context, R.anim.animation);
        tv.startAnimation(anim);
    }

    return tv;
}

private boolean runAnimation() {
    Activity activity = getActivity();
    if (activity != null && activity instanceof MainActivity) {
        return ! ((MainActivity)activity).ignoreAnimation();
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

当然整个Activity - Fragment通信可以大大改进,但是这个例子可以让你了解如何解决这个问题.

虽然它阻止动画启动,但它不会阻止ListView刷新,尽管用户不会注意到.如果您担心性能,可以通过重新使用视图来改进适配器代码:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Context context = FragmentTest.this.getActivity();
    TextView tv = null;
    if (convertView != null && convertView instanceof TextView) {
        tv = (TextView) convertView;
    }
    else {
        tv = new TextView(context);
    }
Run Code Online (Sandbox Code Playgroud)