如何防止scrollView更新
How to prevent scrollView from updating
我在 Android 中有一个带有 scrollView 的 activity。 scrollView 显示一个包含多个项目(文本、更多布局、图像等)的固定布局。加载 activity 后,我显示布局并开始下载图像 - 下载图像后,我将其添加到位于主布局 beginning/top 的 RelativeLayout 中,从而将其显示在 scrollView 中.
Relative 布局的高度设置为WRAP_CONTENT,因此在显示图像之前,其高度为零;当图像被添加到它时,它会调整到图像的高度。问题在于,如果用户在加载图像之前向下滚动并且图像的 RelativeLayout 离开屏幕,则 scrollView 的顶部 Y 会发生变化并且内容会向下移动(这会分散观看内容的人的注意力)。
为了解决这个问题,我获取了下载图像的高度,检查图像是否超出屏幕,如果是,我通过调用 scrollView.scrollBy(0, imageHeight);
调整 scrollView 顶部这解决了问题,但它在两个操作之间有一个 'flickering' 的屏幕,例如,将图像添加到布局(内容向下移动)和调整 scrollView 顶部(内容返回到原始位置)。这是 'fixes' 滚动视图位置的代码:
public void imageLoaded(final ImageView img) {
img.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
final int imgHeight = img.getMeasuredHeight();
// image is loaded inside a relative layout - get the top
final RelativeLayout parent = (RelativeLayout) img.getParent();
final int layoutTop = parent.getTop();
// adjust the layout height to show the image
// 1. this changes the scrollview position and causes a first 'flickering'
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, imgHeight);
parent.setLayoutParams(params);
// adjust scrollbar so that the current content position does not change
// 2. this corrects the scrollview position but causes a second 'flickering'
// scrollY holds the scrollView y position (set in the scrollview listener)
if (layoutTop < scrollY)
scrollview.post(new Runnable() {
public void run() {
scrollview.scrollBy(0, imgHeight);
}
});
img.setVisibility(View.VISIBLE);
}
我需要纠正的是在 loading/adjustment 进程之前禁用屏幕更新或滚动视图更新并在之后启用它的方法。
有人知道怎么做吗?
事实证明,问题是因为对 scrollView.scrollBy 的调用是从线程调用的。删除它解决了问题。这是正确的代码:
public void imageLoaded(final ImageView img) {
img.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
final int imgHeight = img.getMeasuredHeight();
// image is loaded inside a relative layout - get the top
final RelativeLayout parent = (RelativeLayout) img.getParent();
final int layoutTop = parent.getTop();
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, imgHeight);
parent.setLayoutParams(params);
if (layoutTop < scrollY)
scrollview.scrollBy(0, imgHeight);
img.setVisibility(View.VISIBLE);
}
我在 Android 中有一个带有 scrollView 的 activity。 scrollView 显示一个包含多个项目(文本、更多布局、图像等)的固定布局。加载 activity 后,我显示布局并开始下载图像 - 下载图像后,我将其添加到位于主布局 beginning/top 的 RelativeLayout 中,从而将其显示在 scrollView 中.
Relative 布局的高度设置为WRAP_CONTENT,因此在显示图像之前,其高度为零;当图像被添加到它时,它会调整到图像的高度。问题在于,如果用户在加载图像之前向下滚动并且图像的 RelativeLayout 离开屏幕,则 scrollView 的顶部 Y 会发生变化并且内容会向下移动(这会分散观看内容的人的注意力)。
为了解决这个问题,我获取了下载图像的高度,检查图像是否超出屏幕,如果是,我通过调用 scrollView.scrollBy(0, imageHeight);
调整 scrollView 顶部这解决了问题,但它在两个操作之间有一个 'flickering' 的屏幕,例如,将图像添加到布局(内容向下移动)和调整 scrollView 顶部(内容返回到原始位置)。这是 'fixes' 滚动视图位置的代码:
public void imageLoaded(final ImageView img) {
img.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
final int imgHeight = img.getMeasuredHeight();
// image is loaded inside a relative layout - get the top
final RelativeLayout parent = (RelativeLayout) img.getParent();
final int layoutTop = parent.getTop();
// adjust the layout height to show the image
// 1. this changes the scrollview position and causes a first 'flickering'
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, imgHeight);
parent.setLayoutParams(params);
// adjust scrollbar so that the current content position does not change
// 2. this corrects the scrollview position but causes a second 'flickering'
// scrollY holds the scrollView y position (set in the scrollview listener)
if (layoutTop < scrollY)
scrollview.post(new Runnable() {
public void run() {
scrollview.scrollBy(0, imgHeight);
}
});
img.setVisibility(View.VISIBLE);
}
我需要纠正的是在 loading/adjustment 进程之前禁用屏幕更新或滚动视图更新并在之后启用它的方法。
有人知道怎么做吗?
事实证明,问题是因为对 scrollView.scrollBy 的调用是从线程调用的。删除它解决了问题。这是正确的代码:
public void imageLoaded(final ImageView img) {
img.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
final int imgHeight = img.getMeasuredHeight();
// image is loaded inside a relative layout - get the top
final RelativeLayout parent = (RelativeLayout) img.getParent();
final int layoutTop = parent.getTop();
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, imgHeight);
parent.setLayoutParams(params);
if (layoutTop < scrollY)
scrollview.scrollBy(0, imgHeight);
img.setVisibility(View.VISIBLE);
}