• ▲ Android 签到打卡效果


    最近有个同事找我,问我17年的时候,项目那个效果能不能发给他。。。没错是17年的效果。

    效果如下
    可以有多个签到,但是签退只有一次。然后签退之后 进行下一次的签到,签退的过程。
    在这里插入图片描述

    可能有朋友说这有何难?这不就是两个RecycleView 嵌套嘛。其实这个效果的难点就是签到与签退的竖线,会随着签到的item的数量增加而变长

    在这里插入图片描述

    这里就需要不断的测量,随着item的数量的增加测量出那条竖线View该显示的长度。
    核心代码

            holder.mRecyclerViewSign.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                
                    View childAt = layoutManager.getChildAt(Indexes - layoutManager.findFirstVisibleItemPosition());
                    if (childAt != null) {
                        height = childAt.getHeight();
                    }
                    int x = height * signInTime.size();
                    ViewGroup.LayoutParams params = holder.mView.getLayoutParams();
                    params.height = x;
                    holder.mView.setLayoutParams(params);
                }
            });
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    ============================= 全部代码如下 =====================================================

    public class SignTimeAdapter extends RecyclerView.Adapter<SignTimeAdapter.ViewHolderX> {
        private Context mContext;
        private List<HashMap> mlist;
        int height = 0;
    
    
        public SignTimeAdapter(Context cxt, List<HashMap> list) {
            this.mContext = cxt;
            this.mlist = list;
        }
    
        @Override
        public ViewHolderX onCreateViewHolder(ViewGroup parent, int viewType) {
            View inflate = LayoutInflater.from(mContext).inflate(R.layout.item_sign_recycler_list, parent, false);
            ViewHolderX viewHoldX = new ViewHolderX(inflate);
            return viewHoldX;
        }
    
        @Override
        public void onBindViewHolder(final ViewHolderX holder, int position) {
            final int Indexes = position;
            HashMap hashMap = mlist.get(position);
            List<String> signOutTime = (List<String>) hashMap.get("SignOutTime");
    
            Log.e("XX1", signOutTime.size()+"===");
            if (signOutTime.size() == 0) {
                holder.mTvSingClose.setText("");
                holder.mViewX.setVisibility(View.GONE);
                holder.mTimeClock.setVisibility(View.GONE);
                holder.imgSignOut.setVisibility(View.GONE);
                holder.tvSingOut.setVisibility(View.GONE);
            } else {
    
                holder.mViewX.setVisibility(View.VISIBLE);
                holder.mTimeClock.setVisibility(View.VISIBLE);
                holder.imgSignOut.setVisibility(View.VISIBLE);
                holder.tvSingOut.setVisibility(View.VISIBLE);
                holder.mTvSingClose.setText(signOutTime.get(0));
            }
    
    
            final LinearLayoutManager layoutManager = new LinearLayoutManager(mContext);
            holder.mRecyclerViewSign.setLayoutManager(layoutManager);
    
            List<String> strings = (List<String>) hashMap.get("SignInTime");;
            List<String> signInTime = new ArrayList<>();
            signInTime.addAll(strings);
    
            SignTimeItemAdapter signTimeItemAdapter = new SignTimeItemAdapter(mContext, signInTime);
            holder.mRecyclerViewSign.setAdapter(signTimeItemAdapter);
            holder.mRecyclerViewSign.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    View childAt = layoutManager.getChildAt(Indexes - layoutManager.findFirstVisibleItemPosition());
                    if (childAt != null) {
                        height = childAt.getHeight();
                    }
                    int x = height * signInTime.size();
                    ViewGroup.LayoutParams params = holder.mView.getLayoutParams();
                    params.height = x;
                    holder.mView.setLayoutParams(params);
                }
            });
        }
    
    
        @Override
        public int getItemCount() {
            return mlist == null ? 0 : mlist.size();
    
        }
    
        class ViewHolderX extends RecyclerView.ViewHolder {
            RecyclerView mRecyclerViewSign;
            View mView, mViewX;
            TextView mTvSingClose, tvSingOut;
            ImageView mTimeClock, imgSignOut;
    
            public ViewHolderX(View itemView) {
                super(itemView);
                mRecyclerViewSign = (RecyclerView) itemView.findViewById(R.id.recycler_view);
                mView = itemView.findViewById(R.id.view1);
                mViewX = itemView.findViewById(R.id.view2);
                mTvSingClose = (TextView) itemView.findViewById(R.id.tv_sing_close);
                mTimeClock = (ImageView) itemView.findViewById(R.id.time_clock);
                imgSignOut = (ImageView) itemView.findViewById(R.id.img_Sign_out);
                tvSingOut = (TextView) itemView.findViewById(R.id.tv_sing_out);
    
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    public class SignTimeItemAdapter extends RecyclerView.Adapter<SignTimeItemAdapter.ViewHoldX> {
        private List<String> mList;
        private Context mContext;
    
        public SignTimeItemAdapter(Context cxt, List<String> list) {
            this.mContext = cxt;
            this.mList = list;
        }
    
        @Override
        public ViewHoldX onCreateViewHolder(ViewGroup parent, int viewType) {
            View inflate = LayoutInflater.from(mContext).inflate(R.layout.item_sign_x, parent, false);
            ViewHoldX viewHoldX = new ViewHoldX(inflate);
            return viewHoldX;
        }
    
        @Override
        public void onBindViewHolder(ViewHoldX holder, int position) {
    
            holder.tv_sing_on.setText(mList.get(position));
        }
    
        @Override
        public int getItemCount() {
            return mList == null ? 0 : mList.size();
        }
    
        class ViewHoldX extends RecyclerView.ViewHolder {
            TextView tv_sing_on;
    
            public ViewHoldX(View itemView) {
                super(itemView);
                tv_sing_on = (TextView) itemView.findViewById(R.id.tv_sing_on);
    
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    源码地址

  • 相关阅读:
    asp.net+sqlserver汽车4s店销售网站系统c#项目
    简约的博客网页制作 大学生个人博客网页设计模板 学生个人网页成品 DIV简单个人网站作品下载 静态HTML CSS个人网页作业源代码
    java数据结构与算法刷题-----LeetCode1109:航班预订统计
    APK与小程序渗透
    RT-Thread STM32F407 五步完成OLED移植
    ZZULIOJ1039: n个数求和
    正点原子[第二期]ARM(I.MX6U)裸机篇学习笔记-1.2
    第四站:数组
    [13] CUDA_Opencv联合编译过程
    textarea标签改写为富文本框编辑器KindEditor
  • 原文地址:https://blog.csdn.net/MacaoPark/article/details/126414479