RecyclerView的基本使用

    //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和之前的版本中添加内边距,这个属性为了防止内容和边角的重叠

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容