使用GridView / listViewdeviselib – CoordinatorLayout / CollapsingToolbarLayout

这可能是一个愚蠢的问题,但我不明白Design lib。 我正在按照这个参考来创build下面的布局。 当我滚动GridView时,蓝色区域应该作为视差。 但是,当我滚动网格查看AppBarLayout中没有任何反应。

但是,这与NestedScrollViewRecyclerView

布局

以下是我的布局文件 –

 <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:background="#500403" android:layout_height="@dimen/detail_backdrop_height" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:fitsSystemWindows="true"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#122453" app:layout_scrollFlags="scroll|exitUntilCollapsed" android:fitsSystemWindows="true" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginStart="48dp" app:expandedTitleMarginEnd="64dp"> <ImageView android:id="@+id/backdrop" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" android:fitsSystemWindows="true" app:layout_collapseMode="parallax" /> <ImageView android:id="@+id/backdrop1" android:layout_width="50dp" android:layout_height="50dp" android:scaleType="fitCenter" android:fitsSystemWindows="true" android:layout_gravity="center" android:src="@drawable/bar_offline" app:layout_collapseMode="parallax" /> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="#982223" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:layout_collapseMode="pin" /> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <GridView android:id="@+id/grid" android:numColumns="4" android:background="#367723" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> <android.support.design.widget.FloatingActionButton android:layout_height="wrap_content" android:layout_width="wrap_content" app:layout_anchor="@id/appbar" app:layout_anchorGravity="bottom|right|end" android:src="@drawable/bar_offline" android:layout_margin="@dimen/fab_margin" android:clickable="true"/> </android.support.design.widget.CoordinatorLayout> 

任何帮助,将不胜感激。

Solutions Collecting From Web of "使用GridView / listViewdeviselib – CoordinatorLayout / CollapsingToolbarLayout"

使用ListView / GridView,它仅适用于棒棒糖,

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { listView.setNestedScrollingEnabled(true); } 

我认为现在CoordinatorLayout只能用于RecyclerViewNestedScrollView

编辑:

使用 –

 ViewCompat.setNestedScrollingEnabled(listView/gridview,true); (add Android Support v4 Library 23.1 or +) 

一个简单的解决scheme被添加到支持库:

 ViewCompat.setNestedScrollingEnabled(listView,true); 

我已经使用Android Support v4 Library 23.1进行了testing,效果很好。

目前, ListViewGridView只有在API> 21时才具有CoordinatorLayout的预期行为。

要获得这种行为,你必须设置:

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { setNestedScrollingEnabled(true); } 

实施NestedScrollingChild是不够的。 AbsListView没有与支持库一起部署,然后依赖于在设备上运行的SO。

你必须重写AbsListView中的一些方法。 例如,你可以检查onInterceptTouchEvent方法。

在这个代码里面你可以看到:

  case MotionEvent.ACTION_DOWN: { //...... startNestedScroll(SCROLL_AXIS_VERTICAL); //.... } case MotionEvent.ACTION_MOVE: { //..... if (startScrollIfNeeded((int) ev.getX(pointerIndex), y, null)) { //.... } case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: { //.. stopNestedScroll(); break; } 

这段代码只是在执行AbsListView v21 +。 如果您使用API 20或更低版本检查AbsListView,则不会find任何嵌套的滚动引用。

你必须像往常一样把gridview放到NestedScrollview中,然后你必须dynamic地添加gridview的高度。 那么一切都会好起来的。

  <android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="fill_vertical" android:fillViewport="true"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <GridView android:id="@+id/camp_list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@id/toolbar" android:layout_margin="10dp" android:gravity="center" android:horizontalSpacing="10dp" android:numColumns="3" android:stretchMode="columnWidth" android:verticalSpacing="10dp" android:visibility="visible" > </GridView> </LinearLayout> </android.support.v4.widget.NestedScrollView> 

这是为我工作。

https://gist.github.com/sakurabird/6868765

我在NestedScrollView中使用GridView

为了方便,我使用新的ViewCompat解决scheme创build了一个子类:

 public class CoordinatedListView extends ListView { public CoordinatedListView(Context context) { super(context); init(); } public CoordinatedListView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CoordinatedListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public CoordinatedListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } private void init() { ViewCompat.setNestedScrollingEnabled(this, true); } } 

请享用 :)