我们如何在滚动 recyclerview 的同时滚动父布局 android

How can we scroll parent layout while scrolling recyclerview android

请帮我解决以下情况。

我正在开发一个应用程序,在一个页面中我有一个带有背景图像的 Linearlayout 和带有 names.What 列表的 RecyclerView 我需要的是当我向上滚动 RecyclerView 时我需要上面的 LinearLayout 也向上移动这样 recyclerView 中的列表就不会在上面的 LinearLayout 下,当我向下滚动 RecyclerView 时,我需要上面的 LinearLayout 向下滚动,这样我们才能看到完整的图像。

我已经完成的是我使用了 recyclerview 的 setOnScrollListener,在 onScrolled() 函数中我正在向下滚动和向上滚动 event.But 现在我不知道如何继续。

布局如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <include layout="@layout/toolbar"
        android:id="@+id/toolbar" />

    <android.support.v7.widget.CardView
        android:id="@+id/cardview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/toolbar"
        android:layout_margin="8dp"
        card_view:cardBackgroundColor="@android:color/white"
        card_view:cardCornerRadius="8dp">

            <ScrollView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/scrollview"
                android:fillViewport="true">

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

                        <LinearLayout
                            android:id="@+id/map"
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:orientation="vertical"
                            android:background="@drawable/hydeparkmap"
                            android:layout_weight="3" ></LinearLayout>


                        <android.support.v7.widget.RecyclerView
                            android:id="@+id/recycler_view"
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="2"
                            android:scrollbars="vertical" />

                    </LinearLayout>

            </ScrollView>

    </android.support.v7.widget.CardView>

</RelativeLayout>

下面是代码,我在对应的java class:

    @InjectView(R.id.scrollview)
    ScrollView scrollview;

    protected void onCreate(Bundle savedInstanceState) {


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shoplist);
        ButterKnife.inject(this);

        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setTitle("ShopList");

        scrollview.setVerticalScrollBarEnabled(true);
        lm=new LinearLayoutManager(ShopListActivity.this);
        recyclerView.setLayoutManager(lm);
        firstVisibleInListview = lm.findFirstVisibleItemPosition();
        adapter = new RecyclerViewAdapter(ShopListActivity.this, getData());
        recyclerView.setAdapter(adapter);

        recyclerView.addOnItemTouchListener(
                new RecyclerItemClickListener(ShopListActivity.this, new RecyclerItemClickListener.OnItemClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {

                        Intent intent1 = new Intent(ShopListActivity.this, ShopProductListActivity.class);
                        intent1.putExtra("position", String.valueOf(position));
                        intent1.putExtra("shopname", it.get(position).getTitle());
                        intent1.putExtra("shopimage", String.valueOf(it.get(position).getImgIcon()));
                        intent1.putExtra("subcategory", subcategory);
                        startActivity(intent1);

                    }
                })
        );
        recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                int currentFirstVisible = lm.findFirstVisibleItemPosition();

                if(currentFirstVisible > firstVisibleInListview){
                   Toast.makeText(getBaseContext(),"Scrolled up ",Toast.LENGTH_SHORT).show();
                    scrollview.fullScroll(ScrollView.FOCUS_UP);
               }
                else
                    Toast.makeText(getBaseContext(),"Scrolled down ",Toast.LENGTH_SHORT).show();

                firstVisibleInListview = currentFirstVisible;
            }
        });

    }

所以如果我完全理解你的问题,你应该滚动一些视图 循环器视图。 如果是这样,在这种情况下你应该删除你的 ScrollView 因为 RecyclerView 本身就有它。我在这里写的是逐步指南,将 header(不粘)放在 RecyclerView 的顶部,以便它们一起滚动:

1- 首先你需要创建一个包含你的 header 的布局 在我的例子中我有一个 header 的图像所以它看起来像这样:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<ImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:src="@mipmap/winter"/>

</LinearLayout>

我们称这个为header_layout

2- 你需要实现 RecyclerAdapter 的另一个方法 getItemViewType 它的输出将作为第二个参数 onCreateViewHolder(ViewGroup parent,int viewType) 在这里你为你需要的每种视图膨胀布局(对我来说,这两个看起来像这样):

@Override
public int getItemViewType(int position){
    if(position == 0){
        return 0;
    } else {
        return 1;
    }
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView;
    if(viewType==1){
        itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.report_row_layout, parent, false);
    } else {
        itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.report_header_layout, parent, false);
    }

    return new MyViewHolder(itemView);
}

请注意,我的第一个位置 (header) 不同,其他位置相同,您可以对多个位置有多个视图。

3- 如果需要,您应该更改您的 onBindViewHolder 在我的情况下,我需要让它对我的第一个职位不做任何事情

4- 删除您的 ScrollView 并在位置中实现布局,您的主要布局应如下所示:

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<include layout="@layout/toolbar"
    android:id="@+id/toolbar" />

<android.support.v7.widget.CardView
    android:id="@+id/cardview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/toolbar"
    android:layout_margin="8dp"
    card_view:cardBackgroundColor="@android:color/white"
    card_view:cardCornerRadius="8dp">

    <android.support.v7.widget.RecyclerView
         android:id="@+id/recycler_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />

</android.support.v7.widget.CardView>

</RelativeLayout>

我不知道您的 CardView 在做什么,但如果您认为不需要它,请将其删除。如果需要,您可以将 header 设为 LinearLayout 或其他任何内容。

希望这对您有所帮助。