//1.获取控件
lv = (RecyclerView) findViewById(R.id.lv);
//2.数据源
list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
list.add(getE(i));
}
//3.设置适配器
adapter = new MyAdapter(this,list);
lv.setAdapter(adapter);
//4.设置显示方式
//线性方式
/*LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
lv.setLayoutManager(layoutManager);*/
//网格方式
GridLayoutManager layoutManager = new GridLayoutManager(this,2);
lv.setLayoutManager(layoutManager);
//瀑布流方式
/*StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
lv.setLayoutManager(layoutManager);*/
//设置分隔线
/*lv.addItemDecoration(new DividerItemDecoration(this,LinearLayoutManager.HORIZONTAL));
lv.addItemDecoration(new DividerItemDecoration(this,LinearLayoutManager.VERTICAL));*/
//设置item条目的动画效果
lv.setItemAnimator( new DefaultItemAnimator());
(一般使用在滑动Toolbar 和MyBottomView隐藏)滑动监听:
rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
private MyBottomView mBottomView;
private Toolbar mToba;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
Log.e("滑动监听", "onScrollStateChanged: "+newState );
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
MainActivity activity = (MainActivity) getActivity();
mToba = activity.toba;
mBottomView = activity.bottomView;
if (getScollYDistance() <= 0) {
//静止并处于最顶端状态
mToba.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.hong));
mToba.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.hong));
mToba.setVisibility(View.VISIBLE);
mBottomView.setVisibility(View.VISIBLE);
} else if (getScollYDistance() > 0 && getScollYDistance() <= 400) {//滑动在0-400距离的时候
if (getScollYDistance() <= 200) {//处于滑动到中间的时候
mToba.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.hong));
} else {//滑出到200以外
// tvTitle.setBackgroundColor(Color.argb((int) 255, 254, 184, 6));
mToba.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.hong));
}
float scale = (float) getScollYDistance() / 400;
float alpha = (255 * scale);
// 只是layout背景透明(仿知乎滑动效果)
mToba.setBackgroundColor(Color.argb((int) alpha, 254, 184, 6));
} else {
mToba.setVisibility(View.GONE);
mBottomView.setVisibility(View.GONE);
}
}
});
public int getScollYDistance() {
int position = mLayoutManager.findFirstVisibleItemPosition();
View firstVisiableChildView = mLayoutManager.findViewByPosition(position);
int itemHeight = firstVisiableChildView.getHeight();
return (position) * itemHeight - firstVisiableChildView.getTop();
}
多布局的适配器
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private ArrayList<ResultDemo.DataBean.DatasBean> list;
//构造方法传递
public MyAdapter(Context context, ArrayList<ResultDemo.DataBean.DatasBean> list) {
this.context = context;
this.list = list;
}
//设置数据源
public void setList(ArrayList<ResultDemo.DataBean.DatasBean> list) {
this.list = list;
}
//创建显示视图
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int type) {
/**
* 根据不同type类型、创建不同布局ViewHolder
*/
RecyclerView.ViewHolder viewHolder = null;//抽出父类统一返回
if (type == 100){//显示第一种布局
View inflate = LayoutInflater.from(context).inflate(R.layout.layout_item1, null);
viewHolder = new ViewHolderA(inflate);
}else{//显示第二种布局
View inflate = LayoutInflater.from(context).inflate(R.layout.layout_item2, null);
viewHolder = new ViewHolderB(inflate);
}
return viewHolder;//返回统一
}
//绑定数据
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, final int position) {
//获取数据源
ResultDemo.DataBean.DatasBean datasBean = list.get(position);
/**
* 根据不同的viewHolder显示不同的数据操作
*/
if (viewHolder instanceof ViewHolderA){//判断viewHolder是否为ViewHolderA类型
ViewHolderA viewHolderA = (ViewHolderA) viewHolder;//将父类viewHolder强转为子类ViewHolderA
//数据绑定显示
viewHolderA.titleA.setText(datasBean.getTitle());
viewHolderA.sourceA.setText(datasBean.getChapterName());
Glide.with(context).load(datasBean.getEnvelopePic()).into(viewHolderA.imgA);
}else if (viewHolder instanceof ViewHolderB){//判断viewHolder是否为ViewHolderB类型
ViewHolderB viewHolderB = (ViewHolderB) viewHolder;//将父类viewHolder强转为子类ViewHolderB
//数据绑定显示
viewHolderB.titleB.setText(datasBean.getTitle());
viewHolderB.sourceB.setText(datasBean.getChapterName());
Glide.with(context).load(datasBean.getEnvelopePic()).into(viewHolderB.imgB);
}
/**
* 3.实现点击事件的回调处理
*/
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onItemClickListener !=null){
onItemClickListener.onItemClick(position);
}
}
});
//长按监听、返回对应的position位置
viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
//1.通过接口回调,把position传给页面使用
if (onItemClickListener !=null){
onItemClickListener.onLongItemClick(position);
}
//2.默认设置不响应
return false;
}
});
}
//返回集合长度
@Override
public int getItemCount() {
return list.size();
}
/**
* 根据position等不同规则,返回不同的类型值
*
* 本案例使用奇偶数划分
*/
@Override
public int getItemViewType(int position) {
if (position % 2 == 0){
return 100;
}else{
return 200;
}
}
//布局辅助类ViewHolderA
class ViewHolderA extends RecyclerView.ViewHolder{
private ImageView imgA;
private TextView titleA;
private TextView sourceA;
public ViewHolderA(@NonNull View itemView) {
super(itemView);
imgA = itemView.findViewById(R.id.img);
titleA = itemView.findViewById(R.id.title);
sourceA = itemView.findViewById(R.id.source);
}
//布局辅助类ViewHolderB
class ViewHolderB extends RecyclerView.ViewHolder{
private ImageView imgB;
private TextView titleB;
private TextView sourceB;
public ViewHolderB(@NonNull View itemView) {
super(itemView);
imgB = itemView.findViewById(R.id.img);
titleB = itemView.findViewById(R.id.title);
sourceB = itemView.findViewById(R.id.source);
}
}
/**
* 1.定义接口,提供成员变量、实现公开的set方法
*/
private OnItemClickListener onItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
public interface OnItemClickListener{
void onItemClick(int position);
void onLongItemClick(int position);
}
}
CardView的常用属性
班级 功能
card_view:cardElevation 阴影的大小
card_view:cardMaxElevation 阴影最大高度
card_view:cardBackgroundColor 卡片的背景色
card_view:cardCornerRadius 卡片的圆角大小
card_view:contentPadding 卡片内容于边距的间隔
card_view:contentPaddingBottom 卡片内容与底部的边距
card_view:contentPaddingTop 卡片内容与顶部的边距
card_view:contentPaddingLeft 卡片内容与左边的边距
card_view:contentPaddingRight 卡片内容与右边的边距
card_view:contentPaddingStart 卡片内容于边距的间隔起始
card_view:contentPaddingEnd 卡片内容于边距的间隔终止
card_view:cardUseCompatPadding 设置内边距,V21+的版本和之前的版本仍旧具有一样的计算方式
card_view:cardPreventCornerOverlap 在V20和之前的版本中添加内边距,这个属性为了防止内容和边角的重叠