FAB 和 ListView 的快速 Return 模式
Quick Return Pattern for FAB and ListView
我在 ViewPager 中有一个简单的 ListView,在屏幕右下角有一个浮动操作栏。
我想对其实施快速 Return 模式,这样当我滚动 ListView 时,FAB 会在屏幕下方向下滚动并出现在相反的滚动条上。
提前致谢。
编辑:
list.setAdapter(new QuickReturnAdapter(adapter));
quickReturnAttacher = QuickReturnAttacher.forView(list);
quickReturnAttacher.addTargetView(floatMenu, AbsListViewScrollTarget.POSITION_BOTTOM, dpToPx(context, 400));
if (quickReturnAttacher instanceof AbsListViewQuickReturnAttacher) {
// This is the correct way to register an OnScrollListener.
// You have to add it on the QuickReturnAttacher, instead
// of on the viewGroup directly.
final AbsListViewQuickReturnAttacher attacher = (AbsListViewQuickReturnAttacher) quickReturnAttacher;
attacher.addOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
});
}
然后我正在使用 quickReturnAttacher.setOnItemClickListener 但这不起作用。
此功能已有一个开源库。
https://github.com/felipecsl/QuickReturn
试试这个:
final AbsListViewQuickReturnAttacher attacher = (AbsListViewQuickReturnAttacher) quickReturnAttacher;
attacher.addOnScrollListener(this);
attacher.setOnItemClickListener(this);
});
对我来说这是可行的,回调中传递的位置是正确的。
您必须将点击侦听器注册到附件,而不是列表。
怎么在classAbsListViewQuickReturnAttacher
中找不到方法setOnItemClickListener
?
您可以为 ListView 的快速 Return 模式尝试此解决方案:
yourListView.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 (yourListView.getChildCount() > 0) {
scrollOffset += -yourListView.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) {
}
});
我在 ViewPager 中有一个简单的 ListView,在屏幕右下角有一个浮动操作栏。
我想对其实施快速 Return 模式,这样当我滚动 ListView 时,FAB 会在屏幕下方向下滚动并出现在相反的滚动条上。
提前致谢。
编辑:
list.setAdapter(new QuickReturnAdapter(adapter));
quickReturnAttacher = QuickReturnAttacher.forView(list);
quickReturnAttacher.addTargetView(floatMenu, AbsListViewScrollTarget.POSITION_BOTTOM, dpToPx(context, 400));
if (quickReturnAttacher instanceof AbsListViewQuickReturnAttacher) {
// This is the correct way to register an OnScrollListener.
// You have to add it on the QuickReturnAttacher, instead
// of on the viewGroup directly.
final AbsListViewQuickReturnAttacher attacher = (AbsListViewQuickReturnAttacher) quickReturnAttacher;
attacher.addOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
});
}
然后我正在使用 quickReturnAttacher.setOnItemClickListener 但这不起作用。
此功能已有一个开源库。 https://github.com/felipecsl/QuickReturn
试试这个:
final AbsListViewQuickReturnAttacher attacher = (AbsListViewQuickReturnAttacher) quickReturnAttacher;
attacher.addOnScrollListener(this);
attacher.setOnItemClickListener(this);
});
对我来说这是可行的,回调中传递的位置是正确的。 您必须将点击侦听器注册到附件,而不是列表。
怎么在classAbsListViewQuickReturnAttacher
中找不到方法setOnItemClickListener
?
您可以为 ListView 的快速 Return 模式尝试此解决方案:
yourListView.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 (yourListView.getChildCount() > 0) {
scrollOffset += -yourListView.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) {
}
});