版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
RecyclerView下拉刷新和上拉加载更多谷歌在v4包下提供了一个SwipeRefreshLayout来实现RecyclerView的下拉刷新,但是此类并不提供上拉加载更多的一个功能,网上有很多的博客实现了上拉加载,但是上拉的效果图和之前的一样,今天我就实现类似于SwipeRefreshLayout刷新的效果图。圆形进度条的实现类MaterialProgressDrawable,之后解决的就是什么时候让圆形进度条显示,如何让圆形进度条随着手指上下滑动。就是在dispatchTouchEvent分发事件的时候,不断的去检测RecyclerView是否已经下拉到底部了,这时就让圆形进度条显示,如何再向上滑动就向上滑动,向下滑动就向下滑动,松开就计算滑动的高度是否符合加载的高度,符合就固定圆形进度条让其滚动,不符合就消失。判断是否已经到底部了[java]viewplaincopyprivatebooleancanPullUp(){RecyclerView.LayoutManagerlm=mRecyclerView.getLayoutManager();mLastVisiblePosition=getLastVisibleItemPosition();intcount=mRecyclerView.getAdapter().getItemCount();if(0==count){//没有item的时候可以上拉加载returntrue;}elseif(mLastVisiblePosition==(count-1)){//滑到底部了可以上拉加载if(lm.findViewByPosition(count-1).getBottom()<=getMeasuredHeight()){returntrue;}}returnfalse;}不断检测滑动的位置,显示圆形进度条的位置[java]viewplaincopy@OverridepublicbooleandispatchTouchEvent(MotionEventevent){if(!mIsAllowLoadMore)returnsuper.dispatchTouchEvent(event);switch(event.getAction()){caseMotionEvent.ACTION_DOWN:mStartY=(int)event.getRawY();break;caseMotionEvent.ACTION_MOVE:if(!mStart){//如果不满足上拉的条件就直接分发事件if(!canPullUp()){returnsuper.dispatchTouchEvent(event);}if(canPullUp()&&!mIsCanScoll){showRefreshArrow();mStartY=(int)event.getRawY();mIsCanScoll=true;}else{//mStartY=(int)event.getRawY();//hideRefreshArrow();//hide();}if(mVisibleCanScoll){intendY=(int)event.getRawY();intoffset=mStartY-endY;//System.out.println("----------------------offset:"+offset);LayoutParamslp=(LayoutParams)mImageView.getLayoutParams();intbottomMargin=lp.bottomMargin;bottomMargin+=offset;if(bottomMargin>=PULL_IMAGE_SIZE_PX_MAX){bottomMargin=PULL_IMAGE_SIZE_PX_MAX;}if(bottomMargin<=-PULL_IMAGE_SIZE_PX){bottomMargin=-PULL_IMAGE_SIZE_PX;}lp.setMargins(lp.leftMargin,lp.topMargin,lp.rightMargin,bottomMargin);mImageView.setLayoutParams(lp);rotateAniamtor(bottomMargin*ROTATE_ANIM_ANGLE_PER);mStartY=endY;}LayoutParamslp=(LayoutParams)mImageView.getLayoutParams();//如果按住上拉时,上拉箭头向下滑动的时候事件不应分发if(mVisable&&lp.bottomMargin>-PULL_IMAGE_SIZE_PX){mIsDispatch=false;}elseif(mVisable&&lp.bottomMargin==-PULL_IMAGE_SIZE_PX){//等到上拉箭头被隐藏掉的时候在分发事件mIsDispatch=true;}//是否分发事件if(!mIsDispatch){returnfalse;}else{returnsuper.dispatchTouchEvent(event);}}break;caseMotionEvent.ACTION_UP:caseMotionEvent.ACTION_CANCEL:if(!mStart){if(mVisibleCanScoll){LayoutParamslp=(LayoutParams)mImageView.getLayoutParams();if(lp.bottomMargin>=PULL_IMAGE_SIZE_PX_EXECUTE){//lp.setMargins(lp.leftMargin,lp.topMargin,lp.rightMargin,PULL_IMAGE_SIZE_PX/3*2);//mImageView.setLayoutParams(lp);//start();getValueToTranslation();mPrepareAnimation=true;if(mOnPullListener!=null){mOnPullListener.onLoadMore(this);}}else{hideArrow();}}if(!mStart&&!mPrepareAnimation)hideArrow();}mIsCanScoll=false;break;}returnsuper.dispatchTouchEvent(event);}当上拉松开时会有一个滑动的动画[java]viewplaincopy/***执行平移动画*@paramfrom*@paramto*/privatevoidtranslationTo(intfrom,intto,finalbooleanisShow){//1.调用ofInt(int...values)方法创建ValueAnimator对象ValueAnimatormAnimator=ValueAnimator.ofInt(from,to);//2.为目标对象的属性变化设置监听器mAnimator.addUpdateListener(newValueAnimator.AnimatorUpdateListener(){@OverridepublicvoidonAnimationUpdate(ValueAnimatoranimation){//3.为目标对象的属性设置计算好的属性值intanimatorValue=(int)animation.getAnimatedValue();MarginLayoutParamsmarginLayoutParams=(MarginLayoutParams)mImageView.getLayoutParams();marginLayoutParams.bottomMargin=animatorValue;mImageView.setLayoutParams(marginLayoutParams);}});mAnimator.addListener(newAnimatorListenerAdapter(){@OverridepublicvoidonAnimationEnd(Animatoranimation){super.onAnimationEnd(animation);if(isShow){start();mPrepareAnimation=false;}else{hideRefreshArrow();hide();}}});//4.设置动画的持续时间、是否重复及重复次数等属性mAnimator.setDuration(100);//mAnimator.setRepeatCount(3);mAnimator.setRepeatMode(ValueAnimator.INFINITE);//5.为ValueAnimator设置目标对象并开始执行动画mAnimator.setTarget(mImageView);mAnimator.start();}圆形进度条随着滑动的距离产生旋转动画[html]viewplaincopy/***旋转动画效果*/privatevoidrotateAniamtor(floatfrom){ObjectAnimatormAnimatorRotate=ObjectAnimator.ofFloat(mImageView,"rotation",from,from+1);mAnimatorRotate.setRepeatMode(Animation.INFINITE);mAnimatorRotate.setRepeatCount(1);mAnimatorRotate.setDuration(10);mAnimatorRotate.start();}圆形进度条的阴影背景实现[java]viewplaincopy/***mImageView的背景*/privateDrawablegetShapeDrawable(){/***<layer-listxmlns:android="/apk/res/android"><!--第一层上部和左部偏移一定距离--><item><shapeandroid:shape="oval"><solidandroid:color="#f5f5f5"/><!--描边--><strokeandroid:width="0.5dp"android:color="#99f5f5f5"/></shape></item><!--第二层下部和有部偏移一定距离--><itemandroid:left="2dp"android:top="2dp"android:bottom="2dp"android:right="2dp"><shapeandroid:shape="oval"><solidandroid:color="#ffffff"/><!--描边--><!--<strokeandroid:width="0.33dp"android:color="#dedede"/>--></shape></item></layer-list>*///代码实现GradientDrawablegradientDrawable=newGradientDrawable();gradientDrawable.setShape(GradientDrawable.OVAL);gradientDrawable.setColor(Color.parseColor("#f5f5f5"));intstroke=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,0.5f,getContext().getResources().getDisplayMetrics());gradientDrawable.setStroke(stroke,Color.parseColor("#99f5f5f5"));GradientDrawablegradientDrawable2=newGradientDrawable();gradientDrawable2.setShape(GradientDrawable.OVAL);gradientDrawable2.setColor(Color.parseColor("#ffffff"));LayerDrawabledrawable=newLayerDrawable(newDrawable[]{gradientDrawable,gradientDrawable2});intpadding=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,2,getContext().getResources().getDisplayMetrics());drawable.setLayerInset(1,padding,padding,padding,padding);////第一个参数1代表数组的第二个元素,为白色returndrawable;}好了,源码就分析到这,如果发现bug或者有任何意见欢迎留言。源码:[java]viewplaincopypackagecom.cj.recyclerview.refresh;importandroid.animation.Animator;importandroid.animation.AnimatorListenerAdapter;importandroid.animation.ObjectAnimator;importandroid.animation.ValueAnimator;importandroid.content.Context;importandroid.content.res.Resources;importandroid.graphics.Color;importandroid.graphics.drawable.Drawable;importandroid.graphics.drawable.GradientDrawable;importandroid.graphics.drawable.LayerDrawable;importandroid.support.annotation.ColorRes;importandroid.support.v4.widget.SwipeRefreshLayout;importandroid.support.v7.widget.GridLayoutManager;importandroid.support.v7.widget.LinearLayoutManager;importandroid.support.v7.widget.RecyclerView;importandroid.support.v7.widget.StaggeredGridLayoutManager;importandroid.util.AttributeSet;importandroid.util.TypedValue;importandroid.view.MotionEvent;importandroid.view.View;importandroid.view.ViewGroup;importandroid.view.animation.Animation;importandroid.view.animation.DecelerateInterpolator;importandroid.widget.ImageView;importandroid.widget.RelativeLayout;/***Createdbychenjon2016/9/28.*/publicclassPullRefreshLayoutextendsRelativeLayout{privateint[]colors={0xFFFF0000,0xFFFF7F00,0xFFFFFF00,0xFF00FF00,0xFF00FFFF,0xFF0000FF,0xFF8B00FF};privatefinalintCIRCLE_BG_LIGHT=0xFFFAFAFA;privateMaterialProgressDrawablemProgress;privateValueAnimatormValueAnimator;privatebooleanmStart=false;privatebooleanmVisable=false;privatestaticfinalintPULL_IMAGE_SIZE=40;privatestaticintPULL_IMAGE_SIZE_PX;//上拉View的大小(像素)privatestaticintPULL_IMAGE_SIZE_PX_MAX;//最大拉动的距离privatestaticintPULL_IMAGE_SIZE_PX_EXECUTE;//拉动到什么位置开始执行privatestaticintPULL_IMAGE_SIZE_PX_EXECUTE_REFRESH;//刷新是所在的位置privatestaticfloatROTATE_ANIM_ANGLE_PER;//根据最大距离计算旋转角度的比列privateImageViewmImageView;privatebooleanmIsFirst;privateintmStartY,mLastY;privateRecyclerViewmRecyclerView;//privateintmFirstVisiblePosition;privateintmLastVisiblePosition;privatebooleanmIsCanScoll;privatebooleanmVisibleCanScoll;privatebooleanmPrepareAnimation;//准备执行动画privatebooleanmIsAllowLoadMore=true;//是否可以上拉刷新privatebooleanmIsDispatch=true;//是否分发事件publicPullRefreshLayout(Contextcontext){this(context,null);}publicPullRefreshLayout(Contextcontext,AttributeSetattrs){this(context,attrs,0);}publicPullRefreshLayout(Contextcontext,AttributeSetattrs,intdefStyleAttr){super(context,attrs,defStyleAttr);}/***是否允许下拉加载更多*@paramallowLoadMore*/publicvoidsetAllowLoadMore(booleanallowLoadMore){mIsAllowLoadMore=allowLoadMore;}publicbooleanisAllowLoadMore(){returnmIsAllowLoadMore;}/***设置进度圈的颜色*@paramcolors如:0xFFFF0000*/publicvoidsetColorSchemeColors(int...colors){this.colors=colors;}/***设置进度圈的颜色*@paramcolorResIds如:R.color.red*/publicvoidsetColorSchemeResources(@ColorResint...colorResIds){finalResourcesres=getResources();int[]colorRes=newint[colorResIds.length];for(inti=0;i<colorResIds.length;i++){colorRes[i]=res.getColor(colorResIds[i]);}setColorSchemeColors(colorRes);}@OverrideprotectedvoidonLayout(booleanchanged,intl,intt,intr,intb){super.onLayout(changed,l,t,r,b);if(!mIsFirst){createProgressView();over:for(inti=0;i<getChildCount();i++){ViewchildView=getChildAt(i);if(childViewinstanceofSwipeRefreshLayout){ViewGroupviewGroup=(ViewGroup)childView;for(intj=0;j<viewGroup.getChildCount();j++){ViewchildViewJ=viewGroup.getChildAt(j);if(childViewJinstanceofRecyclerView){mRecyclerView=(RecyclerView)childViewJ;breakover;}}}if(childViewinstanceofRecyclerView){mRecyclerView=(RecyclerView)childView;breakover;}}mIsFirst=true;}}@OverridepublicbooleandispatchTouchEvent(MotionEventevent){if(!mIsAllowLoadMore)returnsuper.dispatchTouchEvent(event);switch(event.getAction()){caseMotionEvent.ACTION_DOWN:mStartY=(int)event.getRawY();break;caseMotionEvent.ACTION_MOVE:if(!mStart){//如果不满足上拉的条件就直接分发事件if(!canPullUp()){returnsuper.dispatchTouchEvent(event);}if(canPullUp()&&!mIsCanScoll){showRefreshArrow();mStartY=(int)event.getRawY();mIsCanScoll=true;}else{//mStartY=(int)event.getRawY();//hideRefreshArrow();//hide();}if(mVisibleCanScoll){intendY=(int)event.getRawY();intoffset=mStartY-endY;//System.out.println("----------------------offset:"+offset);LayoutParamslp=(LayoutParams)mImageView.getLayoutParams();intbottomMargin=lp.bottomMargin;bottomMargin+=offset;if(bottomMargin>=PULL_IMAGE_SIZE_PX_MAX){bottomMargin=PULL_IMAGE_SIZE_PX_MAX;}if(bottomMargin<=-PULL_IMAGE_SIZE_PX){bottomMargin=-PULL_IMAGE_SIZE_PX;}lp.setMargins(lp.leftMargin,lp.topMargin,lp.rightMargin,bottomMargin);mImageView.setLayoutParams(lp);rotateAniamtor(bottomMargin*ROTATE_ANIM_ANGLE_PER);mStartY=endY;}LayoutParamslp=(LayoutParams)mImageView.getLayoutParams();//如果按住上拉时,上拉箭头向下滑动的时候事件不应分发if(mVisable&&lp.bottomMargin>-PULL_IMAGE_SIZE_PX){mIsDispatch=false;}elseif(mVisable&&lp.bottomMargin==-PULL_IMAGE_SIZE_PX){//等到上拉箭头被隐藏掉的时候在分发事件mIsDispatch=true;}//是否分发事件if(!mIsDispatch){returnfalse;}else{returnsuper.dispatchTouchEvent(event);}}break;caseMotionEvent.ACTION_UP:caseMotionEvent.ACTION_CANCEL:if(!mStart){if(mVisibleCanScoll){LayoutParamslp=(LayoutParams)mImageView.getLayoutParams();if(lp.bottomMargin>=PULL_IMAGE_SIZE_PX_EXECUTE){//lp.setMargins(lp.leftMargin,lp.topMargin,lp.rightMargin,PULL_IMAGE_SIZE_PX/3*2);//mImageView.setLayoutParams(lp);//start();getValueToTranslation();mPrepareAnimation=true;if(mOnPullListener!=null){mOnPullListener.onLoadMore(this);}}else{hideArrow();}}if(!mStart&&!mPrepareAnimation)hideArrow();}mIsCanScoll=false;break;}returnsuper.dispatchTouchEvent(event);}privatevoidhideArrow(){LayoutParamslp=(LayoutParams)mImageView.getLayoutParams();//lp.setMargins(lp.leftMargin,lp.topMargin,lp.rightMargin,-PULL_IMAGE_SIZE_PX);//mImageView.setLayoutParams(lp);translationTo(lp.bottomMargin,-PULL_IMAGE_SIZE_PX,false);}privatevoidshowRefreshArrow(){mImageView.setVisibility(View.VISIBLE);visable();}/***隐藏箭头显示的载体ImageView*/privatevoidhideRefreshArrow(){mImageView.setVisibility(View.GONE);}privatebooleancanPullUp(){if(mRecyclerView==null||mRecyclerView.getAdapter()==null)returnfalse;RecyclerView.LayoutManagerlm=mRecyclerView.getLayoutManager();mLastVisiblePosition=getLastVisibleItemPosition();intcount=mRecyclerView.getAdapter().getItemCount();if(0==ount){//没有item的时候也可以上拉加载returntrue;}elseif(mLastVisiblePosition==(count-1)){//滑到底部了if(lm.findViewByPosition(count-1).getBottom()<=getMeasuredHeight()){returntrue;}}returnfalse;}/***获取底部可见项的位置**@return*/privateintgetLastVisibleItemPosition(){RecyclerView.LayoutManagerlm=mRecyclerView.getLayoutManager();intlastVisibleItemPosition=0;if(lminstanceofGridLayoutManager){lastVisibleItemPosition=((GridLayoutManager)lm).findLastVisibleItemPosition();}elseif(lminstanceofLinearLayoutManager){lastVisibleItemPosition=((LinearLayoutManager)lm).findLastVisibleItemPosition();}returnlastVisibleItemPosition;}/***创建刷新View和初始化一些数据*/privatevoidcreateProgressView(){mImageView=newImageView(getContext());intsize=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,PULL_IMAGE_SIZE,getContext().getResources().getDisplayMetrics());PULL_IMAGE_SIZE_PX=size;PULL_IMAGE_SIZE_PX_MAX=PULL_IMAGE_SIZE_PX*2;PULL_IMAGE_SIZE_PX_EXECUTE=PULL_IMAGE_SIZE_PX;PULL_IMAGE_SIZE_PX_EXECUTE_REFRESH=PULL_IMAGE_SIZE_PX/3*2;ROTATE_ANIM_ANGLE_PER=(360.0f/PULL_IMAGE_SIZE_PX_MAX);LayoutParamslp=newLayoutParams(size,size);lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);lp.addRule(RelativeLayout.CENTER_HORIZONTAL);lp.setMargins(lp.leftMargin,lp.topMargin,lp.rightMargin,-PULL_IMAGE_SIZE_PX);mImageView.setLayoutParams(lp);mImageView.setBackground(getShapeDrawable());addView(mImageView);mImageView.setVisibility(View.GONE);mProgress=newMaterialProgressDrawable(getContext(),mImageView);mProgress.setBackgroundColor(CIRCLE_BG_LIGHT);//圈圈颜色,可以是多种颜色mProgress.setColorSchemeColors(colors);//设置圈圈的各种大小mProgress.updateSizes(MaterialProgressDrawable.LARGE);mImageView.setImageDrawable(mProgress);}/***mImageView的背景*/privateDrawablegetShapeDrawable(){/***<layer-listxmlns:android="/apk/res/android"><!--第一层上部和左部偏移一定距离--><item><shapeandroid:shape="oval"><solidandroid:color="#f5f5f5"/><!--描边--><strokeandroid:width="0.5dp"android:color="#99f5f5f5"/></shape></item><!--第二层下部和有部偏移一定距离--><itemandroid:left="2dp"android:top="2dp"android:bottom="2dp"android:right="2dp"><shapeandroid:shape="oval"><solidandroid:color="#ffffff"/><!--描边--><!--<strokeandroid:width="0.33dp"android:color="#dedede"/>--></shape></item></layer-list>*///代码实现GradientDrawablegradientDrawable=newGradientDrawable();gradientDrawable.setShape(GradientDrawable.OVAL);gradientDrawable.setColor(Color.parseColor("#f5f5f5"));intstroke=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,0.5f,getContext().getResources().getDisplayMetrics());gradientDrawable.setStroke(stroke,Color.parseColor("#99f5f5f5"));GradientDrawablegradientDrawable2=newGradientDrawable();gradientDrawable2.setShape(GradientDrawable.OVAL);gradientDrawable2.setColor(Color.parseColor("#ffffff"));LayerDrawabledrawable=newLayerDrawable(newDrawable[]{gradientDrawable,gradientDrawable2});intpadding=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,2,getContext().getResources().getDsplayMetrics());drawable.setLayerInset(1,padding,padding,padding,padding);////第一个参数1代表数组的第二个元素,为白色returndrawable;}/***隐藏箭头*/privatevoidhide(){if(mValueAnimator!=null){mValueAnimator.cancel();mVisable=false;mVisibleCanScoll=false;}}privatevoidvisable(){if(mValueAnimator==null){mValueAnimator=mValueAnimator.ofFloat(0f,1f);mValueAnimator.setDuration(10);mValueAnimator.setInterpolator(newDecelerateInterpolator());mValueAnimator.addUpdateListener(newValueAnimator.AnimatorUpdateListener(){@OverridepublicvoidonAnimationUpdate(ValueAnimatoranimation){floatn=(float)animation.getAnimatedValue();//圈圈的旋转角度mProgress.setProgressRotation(n*0.5f);//圈圈周长,0f-1FmProgress.setStartEndTrim(0f,n*0.8f);//箭头大小,0f-1FmProgress.setArrowScale(n);//透明度,0-255mProgress.setAlpha((int)(255*n));}});mValueAnimator.addListener(newAnimatorListenerAdapter(){@OverridepublicvoidonAnimationEnd(Animatoranimation){super.onAnimationEnd(animation);mVisable=true;}});}if(!mValueAnimator.isRunning()){if(!mVisable){//是否显示箭头mProgress.showArrow(true);mValueAnimator.start();mVisibleCanScoll=true;}}}privatevoidstart(){if(mVisable){if(!mStart){mProgress.start();mStart=true;}}}/***计算执行动画的距离参数*/privatevoidgetValueToTranslation(){//如果mImageView还没有被创建出来是不会执行的if(mImageView!=null){LayoutParamslp=(LayoutParams)mImageView.getLayoutParams();intbottomMargin=lp.bottomMargin;//执行平移translationTo(bottomMargin,PULL_IMAGE_SIZE_PX_EXECUTE_REFRESH,true);}}privatevoidstop(){if(mStart){mProgress.stop();mStart=false;mVisable=false;mVisibleCanScoll=false;}}/***执行平移动画*@paramfrom*@paramto*/privatevoidtranslationTo(intfrom,intto,finalbooleanisShow){//1.调用ofInt(int...values)方法创建ValueAnimator对象
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026事业单位工勤技能-江西-江西房管员一级(高级技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-上海-上海医技工三级(高级工)历年参考题库含答案详解3套试卷
- 医院护理部主任工作总结
- 心梗康复训练方案设计
- 2026下半年小学教师资格证考试学科考前押题试卷及解析
- 2026年历史学科知识测试
- 医院院长年度高质量发展推进与综合效益提升工作总结(2篇)
- 国庆消防安全宣传
- 年产3万吨无水三氯化铝和500吨BBTT项目可行性研究报告模板-立项申报用
- 2026及未来5年中国塑钢注射器数据监测研究报告
- 围标串标现象深度透析
- 2026年新疆事业单位招聘考试《职业能力倾向测验》真题
- 2026年天津卷高考语文作文全新真题解读及五篇范文
- 2026西藏拉萨市市直机关事业单位遴选(招聘)公务员(工作人员)19人考试备考试题及答案详解
- 2026年高考全国1卷语文高考真题含答案
- BIM-建筑工程计量与计价 课件 第1、2章 工程造价概述、建筑面积计算 (2023 年规范 )
- 2026年军队文职营房管理面试面试宝典
- 国企工程管理岗笔试试题及答案
- 安徽宣城市2025-2026学年高一上学期期末检测物理试题(原卷版)
- 2026年中青班政治理论水平测试题库
- 2026中信证券IT数据岗笔试题及答案考点速记版
评论
0/150
提交评论