引言:
不知道你有没有遇到这样的问题,当你在一个页面同时写了两个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);
}
}