最近有个同事找我,问我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);
}
}
}