▲ 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);
            }
        });

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

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);

        }
    }
}

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);

        }
    }
}

源码地址

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值