引言:
不知道你有没有遇到这样的问题,当你在一个页面同时写了两个recyclerview,并且装在了同一个ScrollView中,你滑动里面的每一项的时候,如果不加操作,会感觉到极度的不舒适,因为recyclercview自身也带滑动效果,这样你就会出现滑动卡顿的现象。所以这个时候,我们可以设置取消掉它的滑动效果,即:

        //取消recyclerview单独的滑动效果
        mrecyclerview1.setNestedScrollingEnabled(false);
        mrecyclerview2.setNestedScrollingEnabled(false);

效果图如下:


问题:
但是其实新的问题产生了,我第一个View下方的recyclerview应该显示10条item,他却只有4条,这就是一个宽高显示的问题。
1.若已知需要多大的recyclerview,可以直接设置高度为固定值。
2.动态设置:需要注意的是,要通过view的layoutparams获取高度,不要直接调用view.getHeight()方法,因为在onCreate方法还没执行完的时候,这个方法返回值恒为0。
下面我给出动态设置的代码,在Adapter中实现:

package com.example.myapplication1.adapters;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.myapplication1.activities.Main2Activity;
import com.example.myapplication1.listeners.MyListener;
import com.example.myapplication1.R;

import java.util.ArrayList;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private ArrayList<String> mList;
    private boolean mIsSet;
    private View mView;
    private RecyclerView mRecyclerView;
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout,parent,false);
        mView=view;
        ViewHolder viewHolder=new ViewHolder(view);
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(),"You clicked whole item",Toast.LENGTH_SHORT).show();
                v.getContext().startActivity(new Intent(v.getContext(), Main2Activity.class));
            }
        });
        return viewHolder;
    }

// 更改构造函数,传入recyclerview这个布局控件
    public MyAdapter(ArrayList<String> arrayList,RecyclerView recyclerView) {
        mList=arrayList;
        mRecyclerView=recyclerView;
        mIsSet=false;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        String text=mList.get(position);
        holder.txt1.setText(text);
        setRecyclerViewHeight();
    }

    @Override
    public int getItemCount() {
        return mList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        Button btn1;
        Button btn2;
        TextView txt1;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            btn1=(Button)itemView.findViewById(R.id.btn_1);
            btn2=(Button)itemView.findViewById(R.id.btn_2);
            txt1=(TextView) itemView.findViewById(R.id.txt_1);
            btn1.setOnClickListener(new MyListener());
            btn2.setOnClickListener(new MyListener());
        }
    }

    private void setRecyclerViewHeight(){
        if(mIsSet||mRecyclerView==null) return;
        mIsSet=true;
        //不可以用View.getHeight()方法获取高度,因为这个时候控件高度还没有被度量,要在onCreate执行后才会被度量,因此我们需要直接通过获取属性来获取高度!
        /*注意,所有的getLayoutParams方法,获取的都是它在父view中的属性,所以不难理解这两个强制类型转换*/
        RecyclerView.LayoutParams rparam=(RecyclerView.LayoutParams)mView.getLayoutParams();
        int Height=getItemCount()*rparam.height;
        Log.w("length","mview's height is "+rparam.height);
        LinearLayout.LayoutParams layoutParams= (LinearLayout.LayoutParams) mRecyclerView.getLayoutParams();
        layoutParams.height=Height;
        mRecyclerView.setLayoutParams(layoutParams);
    }
}