繁体   English   中英

recyclerview 中的最后一项(在nestedscrollview 内)被剪切,横向剪切viewpager

[英]Last item in recyclerview (inside a nestedscrollview) is cut, landscape orientation cuts the viewpager

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

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

  1. 活动中没有平滑滚动,在 RecyclerView 中它平滑滚动。

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

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

RecyclerView 中的 item 被剪切

方向切割 ViewPager

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

活动细节.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>

电影细节.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 活动中,“viewPager”是我加载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>

下面是适配器类的代码。

拖车适配器.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;
    }

}

在我的情况下,此问题已解决,当 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" />

我不得不在单独的 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>

更新

我正在使用片段,所以上面的布局是在包含 NestedScrollView 的 FrameLayout 中显示的布局,并且仅在平板电脑大屏幕设备的情况下使用。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM