Recyclerview внутри scrollview. Как прокрутить весь контент?

У меня есть Recyclerview внутри Scrollview

 <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 остается фиксированным в верхней строке и recycliewiew содержимое прокрутки независимо в нижней части. Как прокрутить весь контент, т. Е. (LayoutStaticContent + recyclerview content), так что есть только 1 scrollview? Я также попытался заменить scrollview на Nestedscrollview, но не успел.

android,android-recyclerview,nestedscrollview,

7

Ответов: 5


Используйте android.support.v4.widget.NestedScrollViewзатем внутри обоих макетов 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>

И вам придется изменить адаптер recycliewiew, чтобы он содержал:

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

2

если вы хотите прокрутить все данные, я думаю, вам нужно использовать CoordinatorLayout. в CoordinatorLayout вы используете макет панели приложений и 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>

2

После многих поисков и попыток я нашел решение:

1. Задайте высоту для RecyclerView внутри ScrollView:

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

 }

0

Поместите 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>

Я надеюсь, что это помогает!

андроид, андроид-recyclerview, nestedscrollview,
Похожие вопросы