我有一个显然可以滚动的列表视图。列表视图包含一些表单问题。一旦用户提交了表单,我们就会在列表视图的顶部放置一个看起来像邮票的自定义视图(并阻止用户回答问题,但这并不重要)。
标记应该出现在列表视图的顶部(如屏幕顶部)并且可以以与列表视图相同的速度滚动,即当最初位于其下方的列表视图项目在屏幕顶部消失时,它应该消失滚动。
知道如何实现这一目标吗?
我有一个显然可以滚动的列表视图。列表视图包含一些表单问题。一旦用户提交了表单,我们就会在列表视图的顶部放置一个看起来像邮票的自定义视图(并阻止用户回答问题,但这并不重要)。
标记应该出现在列表视图的顶部(如屏幕顶部)并且可以以与列表视图相同的速度滚动,即当最初位于其下方的列表视图项目在屏幕顶部消失时,它应该消失滚动。
知道如何实现这一目标吗?
我找到了解决方案。不确定它是否太优雅,但它可以工作,所以除非有人想出更好的东西,否则它会离开它。
我想与列表一起滚动的视图是自定义视图,它必须了解列表视图。所以我在它上面实现了一个 setListView(ListView listView) 方法:
private int scrollY; //1
private Map<Integer, Integer> listViewItemHeights = new Hashtable<>();
public void setListView(final ListView listView) {
listView.setOnScrollListener(new OnScrollListener() { //2
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {} //3
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //4
View c = listView.getChildAt(0);
if (c != null) {
int oldScrollY = scrollY;
scrollY = -c.getTop();
listViewItemHeights.put(listView.getFirstVisiblePosition(), c.getHeight());
for (int i = 0; i < listView.getFirstVisiblePosition(); ++i) {
if (listViewItemHeights.get(i) != null)
scrollY += listViewItemHeights.get(i);
}
scrollBy(0, scrollY - oldScrollY);
}
}
});
}
评论 1:这是一个变量,让我可以跟踪当前滚动位置。
评论 2:设置一个新的滚动监听器,让我的自定义视图知道何时列表
注释 3:在这种情况下不需要执行。
评论 4:这就是魔法发生的地方。注意最后我通过scrollY-oldScrollY滚动我的视图,让我先从这一点开始。oldScrollY 是保留的滚动位置,scrollY 是新的。我需要滚动它们之间的差异。至于如何计算scrollY,我在这里向您推荐我的答案:Android 在 ListView 中获取准确的滚动位置,这是在列表视图中计算滚动位置的方式。
对于顶部屏幕的视图,您可以添加 headerview 以便将自定义布局绑定为 listview 的 headerlayout ..所以您的滚动与 listview 相同...
View headerview = ((LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.track_footer_view, null, false);
listview.addHeaderView(headerview);