代码之家  ›  专栏  ›  技术社区  ›  Rushikesh Talokar

滚动视图内的循环视图-如何滚动整个内容?

  •  12
  • Rushikesh Talokar  · 技术社区  · 10 年前

    我在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保持固定在顶部&recycleview内容在底部独立滚动。 如何滚动整个内容,即(layoutStaticContent+recyclerview内容),以便只有一个滚动视图? 我还尝试用Nestedcrollview替换scrollview,但没有成功。

    5 回复  |  直到 10 年前
        1
  •  13
  •   AskNilesh    8 年前

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

        2
  •  8
  •   Farid Arbai    8 年前

    将包含静态和动态数据的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
  •  3
  •   Aniket Shinde    10 年前

    解决这个问题的一种可能方法是,只使用带有静态内容的RecyclerView作为Recycleview的标题。

    那么布局将简单为:

    //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);
        }
    }
    
        4
  •  2
  •   Ankur1994a    10 年前

    如果你想滚动所有数据,我想你必须使用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>
    
        5
  •  1
  •   Ester Kaufman    10 年前

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

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