Recyclerview中的最后一项(在嵌套的scrollview内)被剪切,横向方向会切断viewpager

时间:2017-04-16 01:49:04

标签: android android-layout android-recyclerview android-adapter android-nestedscrollview

我在CoordinatorLayout中有一个滚动的AppBarLayout,我在第一个布局中包含另一个布局,它有一个NestedScrollView,RecyclerView和其他一些视图。

我在这个布局中遇到了一些问题。

  1. 活动中没有平滑滚动,在RecyclerView内滚动 顺利。

  2. RecyclerView中的最后一项是从底部剪切的。

  3. 当我更改方向时,它会完全切断底部的ViewPager。因为我不能再滚动了。

  4. Item in the RecyclerView is cut

    Orientation cuts the ViewPager

    我还附上了下面的主要布局和子布局。

    activity_detail.xml

       <?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"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:context=".DetailActivity">
    
        <android.support.design.widget.AppBarLayout
            android:id="@+id/app_bar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">
    
            <android.support.design.widget.CollapsingToolbarLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="true"
                app:contentScrim="?attr/colorPrimary"
                app:layout_scrollFlags="scroll|exitUntilCollapsed">
    
                <ImageView
                    android:id="@+id/iv_movie_backdrop"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:contentDescription="@string/str_movie_backdrop_image"
                    android:scaleType="fitXY" />
    
                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    app:layout_collapseMode="pin" />
    
            </android.support.design.widget.CollapsingToolbarLayout>
        </android.support.design.widget.AppBarLayout>
    
        <include layout="@layout/movie_details" />
    
        <android.support.design.widget.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/fab_margin"
            app:layout_anchor="@id/app_bar"
            app:layout_anchorGravity="bottom|end"
            app:srcCompat="@drawable/ic_favorite_black_24dp" />
    
    </android.support.design.widget.CoordinatorLayout>
    

    movie_details.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
    
        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <android.support.v7.widget.CardView
                android:id="@+id/cv_poster_image"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="10dp"
                android:layout_marginTop="10dp"
                android:elevation="@dimen/card_elevation"
                app:cardCornerRadius="8dp"
                app:cardUseCompatPadding="true"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toTopOf="parent">
    
                <ImageView
                    android:id="@+id/iv_movie_poster"
                    android:layout_width="150dp"
                    android:layout_height="200dp"
                    android:contentDescription="@string/str_movie_poster"
                    android:padding="@dimen/poster_padding"
                    android:scaleType="fitXY"
                    android:src="@drawable/not_found" />
            </android.support.v7.widget.CardView>
    
            <TextView
                android:id="@+id/tv_movie_title"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginEnd="70dp"
                android:layout_marginStart="10dp"
                android:padding="@dimen/poster_padding"
                android:textAppearance="?android:textAppearanceLarge"
                android:textColor="@android:color/black"
                android:textStyle="bold"
                app:layout_constraintLeft_toRightOf="@+id/cv_poster_image"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="@+id/cv_poster_image"
                tools:text="Spider Man and Iron Man" />
    
    
            <TextView
                android:id="@+id/tv_release_date"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:drawablePadding="@dimen/poster_padding"
                android:drawableStart="@drawable/ic_date_range_black_24dp"
                android:gravity="start"
                android:padding="@dimen/poster_padding"
                android:textAppearance="?android:textAppearanceSmall"
                android:textColor="@android:color/black"
                app:layout_constraintLeft_toLeftOf="@+id/tv_movie_title"
                app:layout_constraintTop_toBottomOf="@+id/tv_movie_title"
                tools:text="March, 2017" />
    
            <TextView
                android:id="@+id/tv_rating"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:drawablePadding="@dimen/poster_padding"
                android:drawableStart="@drawable/ic_star_black_24dp"
                android:gravity="start"
                android:padding="@dimen/poster_padding"
                android:textAppearance="?android:textAppearanceSmall"
                android:textColor="@android:color/black"
                app:layout_constraintLeft_toLeftOf="@+id/tv_release_date"
                app:layout_constraintTop_toBottomOf="@+id/tv_release_date"
                tools:text="7.1" />
    
            <TextView
                android:id="@+id/tv_genre"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:padding="@dimen/poster_padding"
                android:textAppearance="?android:textAppearanceSmall"
                android:textColor="@android:color/black"
                android:textStyle="italic"
                app:layout_constraintLeft_toLeftOf="@+id/tv_rating"
                app:layout_constraintTop_toBottomOf="@+id/tv_rating"
                tools:text="Horror | Comedy | Drama" />
    
            <android.support.design.widget.TabLayout
                android:id="@+id/sliding_tabs"
                style="@style/CategoryTab"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginEnd="10dp"
                android:layout_marginStart="10dp"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/cv_poster_image"
                app:tabGravity="fill" />
    
            <android.support.v4.view.ViewPager
                android:id="@+id/viewPager"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginEnd="10dp"
                android:layout_marginStart="10dp"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/sliding_tabs" />
    
        </android.support.constraint.ConstraintLayout>
    </android.support.v4.widget.NestedScrollView>
    

    在movie_details.xml活动中,&#34; viewPager&#34;是我加载RecyclerView的地方。

    它是一个简单的RecyclerView我已经为适配器和下面的RecyclerView添加了代码。

    movie_trailers_fragment.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/rv_movie_trailer_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    

    以下是RecyclerView中每个项目的布局。

    movie_trailer_item.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:elevation="@dimen/card_elevation"
        card_view:cardCornerRadius="8dp"
        card_view:cardUseCompatPadding="true">
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <ImageView
                android:id="@+id/iv_trailer_poster"
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:contentDescription="@string/str_trailer_poster"
                android:scaleType="fitXY"
                android:src="@drawable/not_found" />
    
            <TextView
                android:id="@+id/tv_trailer_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:padding="@dimen/detail_activity_text_padding"
                android:textAppearance="?android:textAppearanceSmall"
                android:textColor="@android:color/black"
                tools:text="This Trailer Is Awesome" />
    
        </LinearLayout>
    
    </android.support.v7.widget.CardView>
    

    以下是适配器类的代码。

    TrailerAdapter.java

    public class MovieTrailersFragment extends Fragment {
        public static final String MOVIE_TRAILERS_KEY = "trailer";
    
        public MovieTrailersFragment() {
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.movie_trailers_fragment, container, false);
            savedInstanceState = this.getArguments();
            List<MovieTrailer> movieTrailerList = (List<MovieTrailer>) savedInstanceState.getSerializable(MOVIE_TRAILERS_KEY);
            RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.rv_movie_trailer_list);
            TrailerAdapter trailerAdapter = new TrailerAdapter(view.getContext());
            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(view.getContext(),LinearLayoutManager.VERTICAL,false);
            recyclerView.setLayoutManager(linearLayoutManager);
            recyclerView.setNestedScrollingEnabled(true);
            recyclerView.setHasFixedSize(true);
            recyclerView.setItemAnimator(new DefaultItemAnimator());
            recyclerView.setAdapter(trailerAdapter);
            trailerAdapter.prepareMovieTrailers(movieTrailerList);
            return view;
        }
    
    }
    

3 个答案:

答案 0 :(得分:1)

在我的情况下,这个问题解决了,当 recyclerView 住院时,在 layout main 的 layout_height 中添加 0dp,以防在片段上使用

<androidx.fragment.app.FragmentContainerView
        android:id="@+id/container"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintVertical_bias="0.0"
        app:navGraph="@navigation/navigation" />

答案 1 :(得分:0)

我必须在单独的LinearLayout中将TabLayout和ViewPager分开,然后才能正常工作。

以下是修改后的布局供参考:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.CardView
            android:id="@+id/cv_poster_image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:layout_marginTop="10dp"
            android:elevation="@dimen/card_elevation"
            app:cardCornerRadius="8dp"
            app:cardUseCompatPadding="true"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <ImageView
                android:id="@+id/iv_movie_poster"
                android:layout_width="150dp"
                android:layout_height="200dp"
                android:contentDescription="@string/str_movie_poster"
                android:padding="@dimen/poster_padding"
                android:scaleType="fitXY"
                android:src="@drawable/not_found" />
        </android.support.v7.widget.CardView>

        <TextView
            android:id="@+id/tv_movie_title"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginEnd="60dp"
            android:layout_marginStart="10dp"
            android:padding="@dimen/poster_padding"
            android:textAppearance="?android:textAppearanceLarge"
            android:textColor="@android:color/black"
            android:textStyle="bold"
            app:layout_constraintLeft_toRightOf="@+id/cv_poster_image"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="@+id/cv_poster_image"
            tools:text="Spider Man and Iron Man" />


        <TextView
            android:id="@+id/tv_release_date"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:drawablePadding="@dimen/poster_padding"
            android:drawableStart="@drawable/ic_date_range_black_24dp"
            android:gravity="start|center_vertical"
            android:padding="@dimen/poster_padding"
            android:textAppearance="?android:textAppearanceSmall"
            android:textColor="@android:color/black"
            app:layout_constraintLeft_toLeftOf="@+id/tv_movie_title"
            app:layout_constraintTop_toBottomOf="@+id/tv_movie_title"
            tools:text="March, 2017" />

        <TextView
            android:id="@+id/tv_rating"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:drawablePadding="@dimen/poster_padding"
            android:drawableStart="@drawable/ic_star_black_24dp"
            android:gravity="start|center_vertical"
            android:padding="@dimen/poster_padding"
            android:textAppearance="?android:textAppearanceSmall"
            android:textColor="@android:color/black"
            app:layout_constraintLeft_toLeftOf="@+id/tv_release_date"
            app:layout_constraintTop_toBottomOf="@+id/tv_release_date"
            tools:text="7.1" />

        <TextView
            android:id="@+id/tv_genre"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:padding="@dimen/poster_padding"
            android:textAppearance="?android:textAppearanceSmall"
            android:textColor="@android:color/black"
            android:textStyle="italic"
            app:layout_constraintLeft_toLeftOf="@+id/tv_rating"
            app:layout_constraintTop_toBottomOf="@+id/tv_rating"
            tools:text="Horror | Comedy | Drama" />

        <android.support.design.widget.FloatingActionButton
            android:id="@+id/fab_tab_layout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/fab_margin"
            android:layout_marginRight="10dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.0"
            app:srcCompat="@drawable/ic_favorite_border_black_24dp" />

    </android.support.constraint.ConstraintLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <android.support.design.widget.TabLayout
            android:id="@+id/sliding_tabs"
            style="@style/CategoryTab"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginEnd="10dp"
            android:layout_marginStart="10dp"
            android:layout_marginTop="10dp"
            app:tabGravity="fill" />

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginEnd="10dp"
            android:layout_marginStart="10dp"
            android:layout_marginTop="10dp" />

    </LinearLayout>

</LinearLayout>

更新

我正在使用片段,因此上面的布局布局显示在FrameLayout内,其中包含NestedScrollView,仅用于Tablet大屏幕设备。

大屏幕中上述片段的容器:

<?xml version="1.0" encoding="utf-8"?>
<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:fillViewport="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <FrameLayout
        android:id="@+id/detail_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</android.support.v4.widget.NestedScrollView>

答案 2 :(得分:0)

我认为您遇到了问题,因为导航栏与您的应用布局重叠。您需要设置导航栏,抛出主题或活动样式