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
问题如下:
我有一个活动,其布局包含:
该片段显示一个ListView,其中包含每行的动画.
如果我在"RelativeLayout"上添加一个View,它会使片段重新调整为新的大小,因为它设置在此RelativeLayout之上,因此每个Row都会重新重建.
你们想以任何方式避免这种情况吗?
编辑:源代码: https ://bitbucket.org/sergicast/listview-animated-buggy
如果添加的页脚视图的布局过程正在运行,请不要启动动画.可以使用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)
| 归档时间: |
|
| 查看次数: |
601 次 |
| 最近记录: |