Android - ViewPager 作为 ListView 中的 Header
Android - ViewPager as a Header in a ListView
TL;DR - ViewPager 作为 ListView Header 造成一些问题。
我的 activity 有一个 ListView 可以显示多种类型的数据..
我有一个 Header 视图,一个粘性视图,其余数据是一个 "normal" 列表项。
我正在使用这个库 -> https://github.com/LarsWerkman/QuickReturnListView
对于我的列表视图。
在我的 HeaderView 中,我有一个查看寻呼机,可以查看我用户的 2 张个人资料图片。
2 个问题:
- 将寻呼机向右滚动到下一张图片不会以全屏宽度打开图片。
(但是如果在列表视图中向下滚动,向上滚动到屏幕顶部 "redraw" header 视图,然后如果您再次滚动寻呼机,它就修复了!)
- 有时图像不会加载到我的视图寻呼机中。
你可以在这些图片中看到那个错误,第一张图片是试图向右滚动寻呼机的状态,第二张图片是错误
有人遇到过这样的问题吗?
我在某些地方了解到,在列表视图中使用视图寻呼机并不是最佳选择,是否有其他方法可以实现我的目标?
几个月前我做了一个和你想做的类似的把戏。我尝试了几乎所有关于这个快速 return 的网络库,但它们都有错误,不适合我。也不适合包含 viewpager 的 header。
后来我实现了自己的滚动监听器。这不是一个快速 return header 模式,但如果有时间,您可以添加动画。
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@SuppressLint("NewApi")
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int scrollOffset = 0;
float transitionY;
if (firstVisibleItem > 0) {
scrollOffset += headerHeight;
if (firstVisibleItem > 1) {
scrollOffset += (firstVisibleItem - 1) * cellHeight;
}
}
if (listView.getChildCount() > 0) {
scrollOffset += -listView.getChildAt(0).getTop();
scrollOffset = -scrollOffset;
}
float scrollDelta = scrollOffset - prevOffset;
float nextY = mQuickReturnView.getY() + scrollDelta;
if (nextY < minRawY) {
transitionY = minRawY;
}
else if (nextY > qReturnDelta) {
transitionY = qReturnDelta;
}
else {
transitionY = nextY;
}
mQuickReturnView.setY(transitionY);
prevOffset = scrollOffset;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
});
我在 header 中使用了一个查看寻呼机和一个 pageradapter。在我的解决方案中,您必须为列表视图项使用固定大小并将其声明为 CellHeight 并为 header 声明为固定大小。这是 QuickReturnHeight
用ListView + Header + ViewPager实现这个模式有点难。
希望对您有所帮助。
我遇到了同样的问题,
尝试删除列表视图的第三方库,
回到那天我用的是同一个,它真的有问题。
请改用普通列表视图。
TL;DR - ViewPager 作为 ListView Header 造成一些问题。
我的 activity 有一个 ListView 可以显示多种类型的数据.. 我有一个 Header 视图,一个粘性视图,其余数据是一个 "normal" 列表项。
我正在使用这个库 -> https://github.com/LarsWerkman/QuickReturnListView 对于我的列表视图。
在我的 HeaderView 中,我有一个查看寻呼机,可以查看我用户的 2 张个人资料图片。
2 个问题:
- 将寻呼机向右滚动到下一张图片不会以全屏宽度打开图片。 (但是如果在列表视图中向下滚动,向上滚动到屏幕顶部 "redraw" header 视图,然后如果您再次滚动寻呼机,它就修复了!)
- 有时图像不会加载到我的视图寻呼机中。
你可以在这些图片中看到那个错误,第一张图片是试图向右滚动寻呼机的状态,第二张图片是错误
有人遇到过这样的问题吗?
我在某些地方了解到,在列表视图中使用视图寻呼机并不是最佳选择,是否有其他方法可以实现我的目标?
几个月前我做了一个和你想做的类似的把戏。我尝试了几乎所有关于这个快速 return 的网络库,但它们都有错误,不适合我。也不适合包含 viewpager 的 header。
后来我实现了自己的滚动监听器。这不是一个快速 return header 模式,但如果有时间,您可以添加动画。
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@SuppressLint("NewApi")
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int scrollOffset = 0;
float transitionY;
if (firstVisibleItem > 0) {
scrollOffset += headerHeight;
if (firstVisibleItem > 1) {
scrollOffset += (firstVisibleItem - 1) * cellHeight;
}
}
if (listView.getChildCount() > 0) {
scrollOffset += -listView.getChildAt(0).getTop();
scrollOffset = -scrollOffset;
}
float scrollDelta = scrollOffset - prevOffset;
float nextY = mQuickReturnView.getY() + scrollDelta;
if (nextY < minRawY) {
transitionY = minRawY;
}
else if (nextY > qReturnDelta) {
transitionY = qReturnDelta;
}
else {
transitionY = nextY;
}
mQuickReturnView.setY(transitionY);
prevOffset = scrollOffset;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
});
我在 header 中使用了一个查看寻呼机和一个 pageradapter。在我的解决方案中,您必须为列表视图项使用固定大小并将其声明为 CellHeight 并为 header 声明为固定大小。这是 QuickReturnHeight
用ListView + Header + ViewPager实现这个模式有点难。
希望对您有所帮助。
我遇到了同样的问题, 尝试删除列表视图的第三方库, 回到那天我用的是同一个,它真的有问题。 请改用普通列表视图。