我使用AppBarLayout
和支持库22中的Toolbar
和TabLayout
进行了两项活动。
两者的布局非常相似:顶部Toolbar
位于其下方TabLayout
,低于ViewPager
,包含3 Fragment
s。
第一个活动的Fragment
有一个RecyclerView
,
第二个活动Fragment
正在使用ListView
。
来自https://github.com/chrisbanes/cheesesquare的可滚动Toolbar
示例在使用RecyclerView
的第一项活动中正常运行,但在ListView
上启用。
我尝试创建了一个扩展ListViewScrollBehavior
的自定义AppBarLayout.ScrollingViewBehavior
,但到目前为止还没有运气。
TouchEvent
仅传递给自定义类以进行水平滚动,但在滚动ListView
(垂直)时则不会传递。
将CoordinatorLayout
与ListView
一起使用的任何方式?
答案 0 :(得分:36)
现在唯一能让它发挥作用的解决方案就是使用它:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
listView.setNestedScrollingEnabled(true);
}
它显然只适用于棒棒糖。
答案 1 :(得分:13)
Nicolas POMEPUY's answer的替代解决方案是使用ViewCompat.setNestedScrollingEnabled(View, boolean)
var contentUrlPassedOn: String!
override func viewDidLoad() {
super.viewDidLoad()
myWebView.delegate = self
let url: NSURL! = NSURL(string: contentUrlPassedOn)
myWebView.loadRequest(NSURLRequest(URL: url))
var request: NSURLRequest
}
当然,嵌套滚动行为只适用于Lollipop。
答案 2 :(得分:11)
我认为CoordinatorLayout
仅适用于RecyclerView
和NestedScrollView
。尝试将ListView
包裹在NestedScrollView
中,或将其转换为RecyclerView
LinearLayoutManager
答案 3 :(得分:5)
对于能够对AppBarLayout做出反应的视图,它需要实现NestedScrollingChild。 ListView不是。但它可以很容易地由代表类实现。使用它,它会像RecyclerView那样做
public class NestedScrollingListView extends ListView implements NestedScrollingChild {
private NestedScrollingChildHelper mNestedScrollingChildHelper;
public NestedScrollingListView(final Context context) {
super(context);
initHelper();
}
public NestedScrollingListView(final Context context, final AttributeSet attrs) {
super(context, attrs);
initHelper();
}
public NestedScrollingListView(final Context context, final AttributeSet attrs, final int defStyleAttr) {
super(context, attrs, defStyleAttr);
initHelper();
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public NestedScrollingListView(final Context context, final AttributeSet attrs, final int defStyleAttr, final int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initHelper();
}
private void initHelper() {
mNestedScrollingChildHelper = new NestedScrollingChildHelper(this);
setNestedScrollingEnabled(true);
}
@Override
public void setNestedScrollingEnabled(final boolean enabled) {
mNestedScrollingChildHelper.setNestedScrollingEnabled(enabled);
}
@Override
public boolean isNestedScrollingEnabled() {
return mNestedScrollingChildHelper.isNestedScrollingEnabled();
}
@Override
public boolean startNestedScroll(final int axes) {
return mNestedScrollingChildHelper.startNestedScroll(axes);
}
@Override
public void stopNestedScroll() {
mNestedScrollingChildHelper.stopNestedScroll();
}
@Override
public boolean hasNestedScrollingParent() {
return mNestedScrollingChildHelper.hasNestedScrollingParent();
}
@Override
public boolean dispatchNestedScroll(final int dxConsumed, final int dyConsumed, final int dxUnconsumed, final int dyUnconsumed, final int[] offsetInWindow) {
return mNestedScrollingChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow);
}
@Override
public boolean dispatchNestedPreScroll(final int dx, final int dy, final int[] consumed, final int[] offsetInWindow) {
return mNestedScrollingChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow);
}
@Override
public boolean dispatchNestedFling(final float velocityX, final float velocityY, final boolean consumed) {
return mNestedScrollingChildHelper.dispatchNestedFling(velocityX, velocityY, consumed);
}
@Override
public boolean dispatchNestedPreFling(final float velocityX, final float velocityY) {
return mNestedScrollingChildHelper.dispatchNestedPreFling(velocityX, velocityY);
}
}
答案 4 :(得分:1)
ListView ScrollingViewBehavior仅支持> = 21。
否则你应该按照以下方式编写代码:
private int mPreviousVisibleItem;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
listView.setNestedScrollingEnabled(true);
} else {
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem > mPreviousVisibleItem) {
appBarLayout.setExpanded(false, true);
} else if (firstVisibleItem < mPreviousVisibleItem) {
appBarLayout.setExpanded(true, true);
}
mPreviousVisibleItem = firstVisibleItem;
}
});
}
答案 5 :(得分:0)
您可以添加
android:nestedScrollingEnabled="true"
从XML到ListView
,请注意,它仅支持API 21+。另外,您可以将ListView
换成RecyclerView
,这样会更好。