【问题标题】:Recyclerview inside scrollview- How to scroll whole content?scrollview 内的 Recyclerview - 如何滚动整个内容?
【发布时间】:2016-01-06 09:00:40
【问题描述】:

我在 Scrollview 中有 Recyclerview

 <Scrollview
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

    <LinearLayout
        android:id="@+id/layoutStaticContent"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

       //Static content.
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="100dp">
           .
           .
        <LinearLayout>

         //Dynamic content(newsfeed)
         <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </LinearLayout>
 </ScrollView>

现在在滚动时,layoutStaticContent 保持固定在顶部,而 recyclerview 内容在底部独立滚动。 如何滚动整个内容,即(layoutStaticContent + recyclerview 内容),使得只有 1 个滚动视图? 我也尝试用 Nestedscrollview 替换滚动视图,但没有成功。

【问题讨论】:

    标签: android android-recyclerview nestedscrollview


    【解决方案1】:

    使用android.support.v4.widget.NestedScrollView 然后在两个布局中 NestedScrollView

    【讨论】:

    • 我一直在寻找这个解决方案
    • 如果有人使用 AndroidX 库而不是 Support 库,则 AndroidX 等效项为:androidx.core.widget.NestedScrollView
    • 你能改写这个吗?是不是说要把ScrollView换成NestedScrollView?
    【解决方案2】:

    将包含静态和动态数据的 LinearLayout 放在 NestedScrollView 中,它会像一个魅力一样工作。

    这是您需要的代码:

    <android.support.v4.widget.NestedScrollView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
    <LinearLayout
        android:id="@+id/layoutStaticContent"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
       //Static content.
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="100dp">
           .
           .
        <LinearLayout>
    
         //Dynamic content(newsfeed)
         <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
    </LinearLayout>
    </android.support.v4.widget.NestedScrollView>
    

    希望对你有帮助!

    【讨论】:

      【解决方案3】:

      解决此问题的一种可能方法是仅使用带有静态内容的 RecyclerView 作为 Recyclerview 的标题。

      那么布局就是:

      //Dynamic content(newsfeed)
           <android.support.v7.widget.RecyclerView
              android:id="@+id/recycler_view"
              android:layout_width="match_parent"
              android:layout_height="match_parent" />
      

      你的静态内容会有一个 list_item_header.xml 布局:

      //Static content.
      <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="100dp">
         .
         .
      <LinearLayout>
      

      您必须更改您的 recyclerview 适配器以包含:

      private static final int TYPE_HEADER = 0;
      private static final int TYPE_ITEM = 1;
      
      @Override
      public int getItemCount()
      {
          int itemCount = super.getItemCount();
          if (mIsHeaderPresent)
          {
              itemCount += 1;
          }
          return itemCount;
      }
      
      
      @Override
      public int getItemViewType(int position)
      {
          if (mIsHeaderPresent && position == 0)
          {
              return TYPE_HEADER;
          }
          return TYPE_ITEM;
      }
      
      @Override
      public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
      {
          if (viewType == TYPE_HEADER)
          {
              View itemView = LayoutInflater.from(parent.getContext())
                      .inflate(R.layout.list_item_header, parent, false);
              ViewHolderHeader viewHolder = new ViewHolderHeader(itemView);
              return viewHolder;
          } else if (viewType == TYPE_ITEM)
          {
              return getItemViewHolder(parent);
          }
      
          throw new RuntimeException("there is no type that matches the type " + viewType + " + make sure your using types correctly");
      }
      
      @Override
      public void onBindViewHolder(RecyclerView.ViewHolder passedViewHolder)
      {
          if (mIsHeaderPresent && passedViewHolder instanceof ViewHolderHeader)
          {
              onBindHeaderViewHolder((ViewHolderHeader) passedViewHolder);
          } else
          {
              onBindItemViewHolder(passedViewHolder);
          }
      }
      

      【讨论】:

      • Ankit 在静态内容中可以有很多项目,这些项目在不同的屏幕上可能会有所不同。而动态内容布局是固定的。所以我宁愿不修改适配器,因为我在很多地方都在使用这个适配器。
      【解决方案4】:

      如果您想滚动所有数据,我认为您必须使用 CoordinatorLayout。在 CoordinatorLayout 中,您可以使用 appbar 布局和 CollapsingToolbarLayout 来放置静态内容。因为它在 android 中使用可滚动容器到另一个可滚动容器的错误方法。你可以像这样使用坐标布局。

      <?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"
      >
      <android.support.design.widget.AppBarLayout
          android:id="@+id/app_bar_layout"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
      
          <android.support.design.widget.CollapsingToolbarLayout
              android:id="@+id/collapsing_toolbar"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              app:contentScrim="?attr/colorPrimary"
              android:fitsSystemWindows="true"
              app:expandedTitleMarginStart="48dp"
              app:expandedTitleMarginEnd="64dp"
              app:layout_scrollFlags="scroll|exitUntilCollapsed">
      
          //Static content.
          <LinearLayout
              android:layout_width="match_parent"
              android:layout_height="100dp">
             .
             .
          <LinearLayout>
      
      </android.support.design.widget.CollapsingToolbarLayout>
      </android.support.design.widget.AppBarLayout>
      
        <android.support.v7.widget.RecyclerView
              android:id="@+id/recycler_view"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
          app:layout_behavior="@string/appbar_scrolling_view_behavior"
        />
      </android.support.design.widget.CoordinatorLayout>
      

      【讨论】:

      • 感谢您的回答。但我不想要可折叠的解决方案。此解决方案的问题是,当向下滚动时,静态内容会立即开始出现,而不是像整个内容一样。
      • 所以你希望你的静态内容看起来也像是你的回收视图的一部分。当它到达它的第一个位置时,只有当静态内容可见时。
      • 我认为@Aniket 的第二个答案会对你有所帮助。
      【解决方案5】:

      经过大量搜索和尝试,我找到了解决方案:

      1。设置 ScrollView 内 RecyclerView 的高度:

          <ScrollView
             android:id="@+id/scrollView"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:fillViewport="true">
          <RelativeLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content">
          ...
          <android.support.v7.widget.RecyclerView
                  android:id="@+id/myPostsRecyclerView"
                  android:layout_width="match_parent"
                  **android:layout_height="550dp"**
                  android:layout_below="@+id/textView7"
                  android:background="@drawable/background"
                  android:padding="5dp"
                  **android:visibility="gone"**
                  tools:listitem="@layout/item_send" />
          </RelativeLayout>
          </ScrollView>
      

      2。在适配器中,您设置数据列表的位置:

      public void setData(List<Post> posts) {
          this.posts.clear();
          this.posts.addAll(posts);
          notifyDataSetChanged();
          if (posts.size() < 1)
              activity.recyclerView.setVisibility(View.GONE);
          else {
              activity.recyclerView.setVisibility(View.VISIBLE);
              ViewGroup.LayoutParams params=activity.recyclerView.getLayoutParams();
              params.height=ViewGroup.LayoutParams.WRAP_CONTENT;
              activity.recyclerView.setLayoutParams(params);
          }
      
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-13
        • 1970-01-01
        • 2020-09-07
        • 1970-01-01
        • 2017-04-08
        • 2016-10-20
        • 1970-01-01
        相关资源
        最近更新 更多