web-dev-qa-db-ja.com

デザインライブラリ-CoordinatorLayout / CollapsingToolbarLayout with GridView / listView

これはばかげた質問かもしれませんが、Design libをよく理解していませんでした。私は このリファレンス に従ってレイアウトを作成しています。 GridViewをスクロールすると、青い領域が視差として機能するはずです。しかし、グリッドビューをスクロールしても、AppBarLayoutで何も起こりません。

しかし、これはNestedScrollViewRecyclerViewで動作します

Layout

以下はマイレイアウトファイルです

<?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>

任意の助けをいただければ幸いです。

27
Tarun Varshney

ListView/GridViewでは、次のコードによってLollipopでのみ機能します。

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

Now CoordinatorLayoutはRecyclerViewNestedScrollViewでのみ動作すると思います

編集:

se-

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

サポートライブラリに簡単なソリューションが追加されました。

ViewCompat.setNestedScrollingEnabled(listView,true);

Android Support v4 Library 23.1でテストしましたが、うまく機能します。

14
daemmie

現在、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 2以下でAbsListViewをチェックすると、ネストされたスクロール参照は見つかりません。

7

通常どおりNestedScrollview内にgridviewを配置する必要があり、その後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>
5
Anantha Babu

便宜上、新しいViewCompatソリューションを使用してサブクラスを作成しました。

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);
    }
}

楽しい :)

0
Shirane85

これは私のために働いています。

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

NestedScrollView内でGridViewを使用します

0
Kishan Vaghela