2016-06-06 7 views
1

Я пытаюсь создать модуль галереи, похожий на instagram, где gridview, содержащий изображения, будет прокручиваться независимо, но при прокрутке gridview, если я касаюсь appbarlayout, он должен начать прокрутку вверх. я смог достигнуть этого с помощью setnestedscrollview, но когда appbarlayout рухнет, он не будет разваливаться до тех пор, пока я не верну галерею наверху. Так что я застрял в том, как разворачивать макет панели приложений при касании панели инструментов, когда gridview не находится в начальной точке, но где-то в between.here мой XMLКак разблокировать appbarlayout, когда gridview не находится наверху

<android.support.design.widget.CoordinatorLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:layout_width="match_parent" 
     android:id="@+id/coordinator" 
     android:focusableInTouchMode="false" 
     android:layout_height="match_parent" 
     android:fitsSystemWindows="true"> 
    <GridView 
      android:layout_below="@+id/iv" 
      android:id="@+id/gridView" 
      android:layout_width="fill_parent" 
      android:layout_height="match_parent" 
      android:layout_margin="5dp" 
      android:columnWidth="100dp" 

      android:drawSelectorOnTop="true" 
      android:gravity="center" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" 
      android:numColumns="5" 
      android:stretchMode="columnWidth" 
      android:verticalSpacing="5dp" 
    android:focusable="true" 
      android:clickable="true"/> 
    <android.support.design.widget.AppBarLayout 
      android:id="@+id/app_bar_layout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:animateLayoutChanges="true" 
      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:animateLayoutChanges="true" 
       app:layout_scrollFlags="scroll|exitUntilCollapsed" 
    app:expandedTitleMarginStart="48dp" 
       app:expandedTitleMarginEnd="64dp" 
       android:fitsSystemWindows="true"> 
    <ImageView 
        android:id="@+id/image" 
        android:src="@drawable/pup" 
        android:layout_width="match_parent" 
        android:layout_height="400dp" 
        android:scaleType="centerCrop" 
        android:adjustViewBounds="true" 
        android:fitsSystemWindows="true" 

        /> 
    <android.support.v7.widget.Toolbar 
        android:id="@+id/toolbar" 
        android:layout_width="match_parent" 
        android:layout_height="40dp" 
        app:layout_collapseMode="pin" 
        android:background="@android:color/transparent" 
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
        /> 
    </android.support.design.widget.CollapsingToolbarLayout> 
    </android.support.design.widget.AppBarLayout> 

здесь, как я реализован nestedscrollview

gridView.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View view, MotionEvent motionEvent) { 
       int y = (int)motionEvent.getRawY(); 
     if(y<=h) 
       { 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
         gridView.setNestedScrollingEnabled(true); 
     } 
        else{ 

        } 
       } 
       else 
       { 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
         gridView.setNestedScrollingEnabled(false); 
         } 
        else 
        { 
         }} 
return false; 
      } 
     }); 

ответ

0

после поиска много я пришел к следующему solution.in XML вид сетки должен быть помещен внутрь вложенной Scrollview после appbarlayout ,

<android.support.v4.widget.NestedScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     android:fillViewport="true" 
     android:id="@+id/nsv"> 
     <GridView 
      android:layout_below="@+id/iv" 
      android:id="@+id/gridView" 
      android:layout_width="fill_parent" 
      android:layout_height="match_parent" 
      android:layout_margin="5dp" 
      android:columnWidth="100dp" 
      android:drawSelectorOnTop="true" 
      android:gravity="center" 
      android:numColumns="3" 
      android:stretchMode="columnWidth" 
      android:verticalSpacing="5dp" 
      android:focusable="true" 
      android:clickable="true" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 
    </android.support.v4.widget.NestedScrollView> 

и прикосновением ГРИД

int flag=1,flag2=0; 
gridView.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent motionEvent) { 
       if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
        v.getParent().requestDisallowInterceptTouchEvent(true);} 
       if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) { 
        int y = (int) motionEvent.getRawY(); 
        if (flag == 1) { 
         if (y <= h) { 
          v.getParent().requestDisallowInterceptTouchEvent(false); 
          boolean fullyExpanded = (appBarLayout.getHeight() - appBarLayout.getBottom()) == 0; 
          if (fullyExpanded) { 
           flag2=0; 
          } 
          else 
          {flag2=1; 
           v.getParent().requestDisallowInterceptTouchEvent(true); 
           if(gridView.getChildAt(0).getTop()==0) 
           { 
            v.getParent().requestDisallowInterceptTouchEvent(false); 
           } 
           else 
           { 
            v.getParent().requestDisallowInterceptTouchEvent(true);}}} 
         else 
         { 
          v.getParent().requestDisallowInterceptTouchEvent(true); 
          flag2=0;} 
        }} 
       if (motionEvent.getAction() == MotionEvent.ACTION_UP) { 
        v.getParent().requestDisallowInterceptTouchEvent(true); 
       } 
       return false; 
      }}); 

и переключить прикосновение coordinatorlayout-

coordinatorLayout.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View view, MotionEvent motionEvent) { 
       boolean fullyExpanded = (appBarLayout.getHeight() - appBarLayout.getBottom()) == 0; 
       if(flag2==0&&fullyExpanded) 
        return true; 
       else{ 
        flag2=0; 
       return false; 
      }} 
     });