فهرست منبع

绑定老师课表页面UI和接口逻辑

Pq 3 سال پیش
والد
کامیت
3e5ecb7901
31فایلهای تغییر یافته به همراه1132 افزوده شده و 39 حذف شده
  1. 1 1
      BaseLibrary/build.gradle
  2. 4 0
      BaseLibrary/src/main/java/com/cooleshow/base/utils/GlideUtils.kt
  3. 1 0
      BaseLibrary/src/main/java/com/cooleshow/base/widgets/MyCalenderView.java
  4. 523 0
      BaseLibrary/src/main/java/com/cooleshow/base/widgets/QMUIRadiusImageView.java
  5. 7 0
      BaseLibrary/src/main/res/drawable/bg_white_10dp.xml
  6. 8 0
      BaseLibrary/src/main/res/drawable/bg_white_top_10dp.xml
  7. 18 0
      BaseLibrary/src/main/res/layout/empty_layout.xml
  8. 95 0
      BaseLibrary/src/main/res/layout/pickerview_default_layout.xml
  9. 13 0
      BaseLibrary/src/main/res/values/attrs.xml
  10. 8 1
      BaseLibrary/src/main/res/values/colors.xml
  11. 6 0
      BaseLibrary/src/main/res/values/styles.xml
  12. 80 6
      teacher/src/main/java/com/cooleshow/teacher/adapter/CourseTableListAdapter.kt
  13. 4 3
      teacher/src/main/java/com/cooleshow/teacher/api/APIService.java
  14. 65 0
      teacher/src/main/java/com/cooleshow/teacher/bean/CourseTableDataBean.java
  15. 0 7
      teacher/src/main/java/com/cooleshow/teacher/bean/CourseTableListBean.java
  16. 2 0
      teacher/src/main/java/com/cooleshow/teacher/contract/CourseTableContract.java
  17. 25 5
      teacher/src/main/java/com/cooleshow/teacher/presenter/main/CourseTablePresenter.java
  18. 114 10
      teacher/src/main/java/com/cooleshow/teacher/ui/main/CourseTableFragment.kt
  19. BIN
      teacher/src/main/res/drawable-xhdpi/icon_chat_small.png
  20. BIN
      teacher/src/main/res/drawable-xhdpi/icon_clock.png
  21. BIN
      teacher/src/main/res/drawable-xhdpi/icon_live_bg.png
  22. BIN
      teacher/src/main/res/drawable-xxhdpi/icon_chat_small.png
  23. BIN
      teacher/src/main/res/drawable-xxhdpi/icon_clock.png
  24. BIN
      teacher/src/main/res/drawable-xxhdpi/icon_live_bg.png
  25. BIN
      teacher/src/main/res/drawable-xxhdpi/icon_teacher_default_head.png
  26. 5 0
      teacher/src/main/res/drawable/shape_course_status_ing.xml
  27. 6 0
      teacher/src/main/res/drawable/shape_course_status_normal.xml
  28. 5 0
      teacher/src/main/res/drawable/shape_couse_type_text_bg.xml
  29. 140 5
      teacher/src/main/res/layout/item_course_table_layout.xml
  30. 1 0
      teacher/src/main/res/values/strings.xml
  31. 1 1
      usercenter/src/main/res/layout/activity_login.xml

+ 1 - 1
BaseLibrary/build.gradle

@@ -119,5 +119,5 @@ dependencies {
     api "com.haibin:calendarview:3.7.1"
 
     api 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.7'
-
+    api 'com.contrarywind:Android-PickerView:4.1.9'
 }

+ 4 - 0
BaseLibrary/src/main/java/com/cooleshow/base/utils/GlideUtils.kt

@@ -16,6 +16,10 @@ object GlideUtils {
         Glide.with(context).load(url).centerCrop().into(imageView)
     }
 
+    fun loadImage(context: Context, url: String, imageView: ImageView,defaultDrawable : Int) {
+        Glide.with(context).load(url).placeholder(defaultDrawable).into(imageView)
+    }
+
     fun loadImageFitCenter(context: Context, url: String, imageView: ImageView) {
         Glide.with(context).load(url).fitCenter().into(imageView)
     }

+ 1 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/MyCalenderView.java

@@ -5,6 +5,7 @@ import android.util.AttributeSet;
 
 import com.haibin.calendarview.CalendarView;
 
+
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 

+ 523 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/QMUIRadiusImageView.java

@@ -0,0 +1,523 @@
+package com.cooleshow.base.widgets;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.BitmapShader;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorFilter;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
+import android.graphics.RectF;
+import android.graphics.Shader;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.ImageView;
+
+import com.cooleshow.base.R;
+
+import androidx.annotation.ColorInt;
+import androidx.appcompat.widget.AppCompatImageView;
+
+
+/**
+ * 提供为图片添加圆角、边框、剪裁到圆形或其他形状等功能。
+ *
+ * @author cginechen
+ * @date 2015-07-09
+ */
+public class QMUIRadiusImageView extends AppCompatImageView {
+    private static final int DEFAULT_BORDER_COLOR = Color.GRAY;
+
+    private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
+    private static final int COLOR_DRAWABLE_DIMEN = 2;
+
+    private boolean mIsSelected = false;
+    private boolean mIsOval = false;
+    private boolean mIsCircle = false;
+
+    private int mBorderWidth;
+    private int mBorderColor;
+
+    private int mSelectedBorderWidth;
+    private int mSelectedBorderColor;
+    private int mSelectedMaskColor;
+    private boolean mIsTouchSelectModeEnabled = true;
+
+    private int mCornerRadius;
+
+    private Paint mBitmapPaint;
+    private Paint mBorderPaint;
+    private ColorFilter mColorFilter;
+    private ColorFilter mSelectedColorFilter;
+    private BitmapShader mBitmapShader;
+    private boolean mNeedResetShader = false;
+
+    private RectF mRectF = new RectF();
+
+    private Bitmap mBitmap;
+
+    private Matrix mMatrix;
+    private int mWidth;
+    private int mHeight;
+
+    public QMUIRadiusImageView(Context context) {
+        this(context, null, R.attr.QMUIRadiusImageViewStyle);
+    }
+
+    public QMUIRadiusImageView(Context context, AttributeSet attrs) {
+        this(context, attrs, R.attr.QMUIRadiusImageViewStyle);
+    }
+
+    public QMUIRadiusImageView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+
+        mBorderPaint = new Paint();
+        mBorderPaint.setAntiAlias(true);
+        mBorderPaint.setStyle(Paint.Style.STROKE);
+        mMatrix = new Matrix();
+
+        setScaleType(ImageView.ScaleType.CENTER_CROP);
+
+        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.QMUIRadiusImageView, defStyleAttr, 0);
+
+        mBorderWidth = array.getDimensionPixelSize(R.styleable.QMUIRadiusImageView_qmui_border_width, 0);
+        mBorderColor = array.getColor(R.styleable.QMUIRadiusImageView_qmui_border_color, DEFAULT_BORDER_COLOR);
+        mSelectedBorderWidth = array.getDimensionPixelSize(
+                R.styleable.QMUIRadiusImageView_qmui_selected_border_width, mBorderWidth);
+        mSelectedBorderColor = array.getColor(R.styleable.QMUIRadiusImageView_qmui_selected_border_color, mBorderColor);
+        mSelectedMaskColor = array.getColor(R.styleable.QMUIRadiusImageView_qmui_selected_mask_color, Color.TRANSPARENT);
+        if (mSelectedMaskColor != Color.TRANSPARENT) {
+            mSelectedColorFilter = new PorterDuffColorFilter(mSelectedMaskColor, PorterDuff.Mode.DARKEN);
+        }
+
+        mIsTouchSelectModeEnabled = array.getBoolean(R.styleable.QMUIRadiusImageView_qmui_is_touch_select_mode_enabled, true);
+        mIsCircle = array.getBoolean(R.styleable.QMUIRadiusImageView_qmui_is_circle, false);
+        if (!mIsCircle) {
+            mIsOval = array.getBoolean(R.styleable.QMUIRadiusImageView_qmui_is_oval, false);
+        }
+        if (!mIsOval) {
+            mCornerRadius = array.getDimensionPixelSize(R.styleable.QMUIRadiusImageView_qmui_corner_radius, 0);
+        }
+        array.recycle();
+    }
+
+    @Override
+    public void setScaleType(ImageView.ScaleType scaleType) {
+        if (scaleType != ImageView.ScaleType.CENTER_CROP) {
+            throw new IllegalArgumentException(String.format("不支持ScaleType %s", scaleType));
+        }
+        super.setScaleType(scaleType);
+    }
+
+    @Override
+    public void setAdjustViewBounds(boolean adjustViewBounds) {
+        if (adjustViewBounds) {
+            throw new IllegalArgumentException("不支持adjustViewBounds");
+        }
+    }
+
+    public void setBorderWidth(int borderWidth) {
+        if (mBorderWidth != borderWidth) {
+            mBorderWidth = borderWidth;
+            invalidate();
+        }
+    }
+
+    public void setBorderColor(@ColorInt int borderColor) {
+        if (mBorderColor != borderColor) {
+            mBorderColor = borderColor;
+            invalidate();
+        }
+    }
+
+    public void setCornerRadius(int cornerRadius) {
+        if (mCornerRadius != cornerRadius) {
+            mCornerRadius = cornerRadius;
+            if (!mIsCircle && !mIsOval) {
+                invalidate();
+            }
+        }
+    }
+
+    public void setSelectedBorderColor(@ColorInt int selectedBorderColor) {
+        if (mSelectedBorderColor != selectedBorderColor) {
+            mSelectedBorderColor = selectedBorderColor;
+            if (mIsSelected) {
+                invalidate();
+            }
+        }
+
+    }
+
+    public void setSelectedBorderWidth(int selectedBorderWidth) {
+        if (mSelectedBorderWidth != selectedBorderWidth) {
+            mSelectedBorderWidth = selectedBorderWidth;
+            if (mIsSelected) {
+                invalidate();
+            }
+        }
+    }
+
+    public void setSelectedMaskColor(@ColorInt int selectedMaskColor) {
+        if (mSelectedMaskColor != selectedMaskColor) {
+            mSelectedMaskColor = selectedMaskColor;
+            if (mSelectedMaskColor != Color.TRANSPARENT) {
+                mSelectedColorFilter = new PorterDuffColorFilter(mSelectedMaskColor, PorterDuff.Mode.DARKEN);
+            } else {
+                mSelectedColorFilter = null;
+            }
+            if (mIsSelected) {
+                invalidate();
+            }
+        }
+        mSelectedMaskColor = selectedMaskColor;
+    }
+
+
+    public void setCircle(boolean isCircle) {
+        if (mIsCircle != isCircle) {
+            mIsCircle = isCircle;
+            requestLayout();
+            invalidate();
+        }
+    }
+
+    public void setOval(boolean isOval) {
+        boolean forceUpdate = false;
+        if (isOval) {
+            if (mIsCircle) {
+                // 必须先取消圆形
+                mIsCircle = false;
+                forceUpdate = true;
+            }
+
+        }
+        if (mIsOval != isOval || forceUpdate) {
+            mIsOval = isOval;
+            requestLayout();
+            invalidate();
+        }
+    }
+
+    public int getBorderColor() {
+        return mBorderColor;
+    }
+
+    public int getBorderWidth() {
+        return mBorderWidth;
+    }
+
+    public int getCornerRadius() {
+        return mCornerRadius;
+    }
+
+    public int getSelectedBorderColor() {
+        return mSelectedBorderColor;
+    }
+
+    public int getSelectedBorderWidth() {
+        return mSelectedBorderWidth;
+    }
+
+    public int getSelectedMaskColor() {
+        return mSelectedMaskColor;
+    }
+
+
+    public boolean isCircle() {
+        return mIsCircle;
+    }
+
+    public boolean isOval() {
+        return !mIsCircle && mIsOval;
+    }
+
+    public boolean isSelected() {
+        return mIsSelected;
+    }
+
+    public void setSelected(boolean isSelected) {
+        if (mIsSelected != isSelected) {
+            mIsSelected = isSelected;
+            invalidate();
+        }
+    }
+
+    public void setTouchSelectModeEnabled(boolean touchSelectModeEnabled) {
+        mIsTouchSelectModeEnabled = touchSelectModeEnabled;
+    }
+
+    public boolean isTouchSelectModeEnabled() {
+        return mIsTouchSelectModeEnabled;
+    }
+
+    public void setSelectedColorFilter(ColorFilter cf) {
+        if (mSelectedColorFilter == cf) {
+            return;
+        }
+        mSelectedColorFilter = cf;
+        if (mIsSelected) {
+            invalidate();
+        }
+    }
+
+    @Override
+    public void setColorFilter(ColorFilter cf) {
+        if (mColorFilter == cf) {
+            return;
+        }
+        mColorFilter = cf;
+        if (!mIsSelected) {
+            invalidate();
+        }
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        int width = getMeasuredWidth();
+        int height = getMeasuredHeight();
+        if (mIsCircle) {
+            int size = Math.min(width, height);
+            setMeasuredDimension(size, size);
+        } else {
+            int widthMode = View.MeasureSpec.getMode(widthMeasureSpec);
+            int heightMode = View.MeasureSpec.getMode(heightMeasureSpec);
+            if (mBitmap == null) {
+                return;
+            }
+            boolean widthWrapContent = widthMode == View.MeasureSpec.AT_MOST || widthMode == View.MeasureSpec.UNSPECIFIED;
+            boolean heightWrapContent = heightMode == View.MeasureSpec.AT_MOST || heightMode == View.MeasureSpec.UNSPECIFIED;
+            float bmWidth = mBitmap.getWidth(), bmHeight = mBitmap.getHeight();
+            float scaleX = width / bmWidth, scaleY = height / bmHeight;
+            if (widthWrapContent && heightWrapContent) {
+                // 保证长宽比
+                if (scaleX >= 1 && scaleY >= 1) {
+                    setMeasuredDimension((int) bmWidth, (int) bmHeight);
+                    return;
+                }
+
+                if (scaleX >= 1) {
+                    setMeasuredDimension((int) (bmHeight * scaleY), height);
+                    return;
+                }
+
+                if (scaleY >= 1) {
+                    setMeasuredDimension(width, (int) (bmHeight * scaleX));
+                    return;
+                }
+
+                if (scaleX < scaleY) {
+                    setMeasuredDimension(width, (int) (bmHeight * scaleX));
+                } else {
+                    setMeasuredDimension((int) (bmWidth * scaleY), height);
+                }
+            } else if (widthWrapContent) {
+                setMeasuredDimension((int) (bmWidth * scaleY), height);
+            } else if (heightWrapContent) {
+                setMeasuredDimension(width, (int) (bmHeight * scaleX));
+            }
+        }
+    }
+
+
+    @Override
+    public void setImageDrawable(Drawable drawable) {
+        super.setImageDrawable(drawable);
+        setupBitmap();
+    }
+
+    @Override
+    public void setImageURI(Uri uri) {
+        super.setImageURI(uri);
+        setupBitmap();
+    }
+
+    private Bitmap getBitmap() {
+        Drawable drawable = getDrawable();
+        if (drawable == null) {
+            return null;
+        }
+
+        if (drawable instanceof BitmapDrawable) {
+            Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
+            if (bitmap == null) {
+                return null;
+            }
+            float bmWidth = bitmap.getWidth(), bmHeight = bitmap.getHeight();
+            if (bmWidth == 0 || bmHeight == 0) {
+                return null;
+            }
+            // ensure minWidth and minHeight
+            float minScaleX = getMinimumWidth() / bmWidth, minScaleY = getMinimumHeight() / bmHeight;
+            if (minScaleX > 1 || minScaleY > 1) {
+                float scale = Math.max(minScaleX, minScaleY);
+                Matrix matrix = new Matrix();
+                matrix.postScale(scale, scale);
+
+                return Bitmap.createBitmap(bitmap, 0, 0, (int) bmWidth, (int) bmHeight, matrix, false);
+            } else {
+                return bitmap;
+            }
+        }
+
+        try {
+            Bitmap bitmap;
+
+            if (drawable instanceof ColorDrawable) {
+                bitmap = Bitmap.createBitmap(COLOR_DRAWABLE_DIMEN, COLOR_DRAWABLE_DIMEN, BITMAP_CONFIG);
+            } else {
+                bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
+            }
+
+            Canvas canvas = new Canvas(bitmap);
+            drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+            drawable.draw(canvas);
+            return bitmap;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+    public void setupBitmap() {
+        Bitmap bm = getBitmap();
+        if (bm == mBitmap) {
+            return;
+        }
+        mBitmap = bm;
+        if (mBitmap == null) {
+            mBitmapShader = null;
+            invalidate();
+            return;
+        }
+        mNeedResetShader = true;
+        mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
+        if (mBitmapPaint == null) {
+            mBitmapPaint = new Paint();
+            mBitmapPaint.setAntiAlias(true);
+        }
+        mBitmapPaint.setShader(mBitmapShader);
+        requestLayout();
+        invalidate();
+    }
+
+    private void updateBitmapShader() {
+        mMatrix.reset();
+        mNeedResetShader = false;
+        if (mBitmapShader == null || mBitmap == null) {
+            return;
+        }
+        final float bmWidth = mBitmap.getWidth();
+        final float bmHeight = mBitmap.getHeight();
+        final float scaleX = mWidth / bmWidth;
+        final float scaleY = mHeight / bmHeight;
+        final float scale = Math.max(scaleX, scaleY);
+        mMatrix.setScale(scale, scale);
+        mMatrix.postTranslate(-(scale * bmWidth - mWidth) / 2, -(scale * bmHeight - mHeight) / 2);
+        mBitmapShader.setLocalMatrix(mMatrix);
+        mBitmapPaint.setShader(mBitmapShader);
+    }
+
+    private void drawBitmap(Canvas canvas, int borderWidth) {
+        final float halfBorderWidth = borderWidth * 1.0f / 2;
+        mBitmapPaint.setColorFilter(mIsSelected ? mSelectedColorFilter : mColorFilter);
+
+        if (mIsCircle) {
+            int center = getWidth() / 2;
+            canvas.drawCircle(center, center, center - halfBorderWidth, mBitmapPaint);
+        } else {
+            mRectF.left = halfBorderWidth;
+            //noinspection SuspiciousNameCombination
+            mRectF.top = halfBorderWidth;
+            mRectF.right = getWidth() - halfBorderWidth;
+            mRectF.bottom = getHeight() - halfBorderWidth;
+            if (mIsOval) {
+                canvas.drawOval(mRectF, mBitmapPaint);
+            } else {
+                canvas.drawRoundRect(mRectF, mCornerRadius, mCornerRadius, mBitmapPaint);
+            }
+        }
+    }
+
+    private void drawBorder(Canvas canvas, int borderWidth) {
+        if (borderWidth <= 0) {
+            return;
+        }
+        final float halfBorderWidth = borderWidth * 1.0f / 2;
+        mBorderPaint.setColor(mIsSelected ? mSelectedBorderColor : mBorderColor);
+        mBorderPaint.setStrokeWidth(borderWidth);
+        if (mIsCircle) {
+            int radius = getWidth() / 2;
+            canvas.drawCircle(radius, radius, radius - halfBorderWidth, mBorderPaint);
+        } else {
+            mRectF.left = halfBorderWidth;
+            //noinspection SuspiciousNameCombination
+            mRectF.top = halfBorderWidth;
+            mRectF.right = getWidth() - halfBorderWidth;
+            mRectF.bottom = getHeight() - halfBorderWidth;
+            if (mIsOval) {
+                canvas.drawOval(mRectF, mBorderPaint);
+            } else {
+                canvas.drawRoundRect(mRectF, mCornerRadius, mCornerRadius, mBorderPaint);
+            }
+        }
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        int width = getWidth(), height = getHeight();
+        if (width <= 0 || height <= 0) {
+            return;
+        }
+
+        int borderWidth = mIsSelected ? mSelectedBorderWidth : mBorderWidth;
+
+        if (mBitmap == null || mBitmapShader == null) {
+            drawBorder(canvas, borderWidth);
+            return;
+        }
+
+        if (mWidth != width || mHeight != height || mNeedResetShader) {
+            mWidth = width;
+            mHeight = height;
+            updateBitmapShader();
+        }
+        drawBitmap(canvas, borderWidth);
+        drawBorder(canvas, borderWidth);
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        if (!this.isClickable()) {
+            this.setSelected(false);
+            return super.onTouchEvent(event);
+        }
+
+        if (!mIsTouchSelectModeEnabled) {
+            return super.onTouchEvent(event);
+        }
+        switch (event.getAction()) {
+            case MotionEvent.ACTION_DOWN:
+                this.setSelected(true);
+                break;
+            case MotionEvent.ACTION_UP:
+            case MotionEvent.ACTION_SCROLL:
+            case MotionEvent.ACTION_OUTSIDE:
+            case MotionEvent.ACTION_CANCEL:
+                this.setSelected(false);
+                break;
+        }
+        return super.onTouchEvent(event);
+    }
+}

+ 7 - 0
BaseLibrary/src/main/res/drawable/bg_white_10dp.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@color/white" />
+    <corners
+        android:radius="10dp" />
+</shape>

+ 8 - 0
BaseLibrary/src/main/res/drawable/bg_white_top_10dp.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@color/white" />
+    <corners
+        android:topLeftRadius="@dimen/dp_10"
+        android:topRightRadius="@dimen/dp_10" />
+</shape>

+ 18 - 0
BaseLibrary/src/main/res/layout/empty_layout.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:gravity="center"
+    android:layout_height="match_parent">
+
+    <ImageView
+        android:id="@+id/iv_empty_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+    <TextView
+        android:id="@+id/tv_empty_tip"
+        android:textColor="@color/color_999999"
+        android:textSize="@dimen/sp_14"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+</LinearLayout>

+ 95 - 0
BaseLibrary/src/main/res/layout/pickerview_default_layout.xml

@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@drawable/bg_white_top_10dp"
+    android:orientation="vertical">
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="50dp">
+
+
+        <TextView
+            android:id="@+id/tv_cancel"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerVertical="true"
+            android:layout_marginLeft="17dp"
+            android:text="取消"
+            android:textColor="@color/color_999999"
+            android:textSize="@dimen/dp_16" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerInParent="true"
+            android:text=""
+            android:textColor="@color/color_1a1a1a"
+            android:textSize="18dp" />
+
+        <TextView
+            android:id="@+id/tv_finish"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentRight="true"
+            android:layout_centerVertical="true"
+            android:layout_marginRight="17dp"
+            android:padding="8dp"
+            android:text="确定"
+            android:textColor="@color/colorPrimary"
+            android:textSize="@dimen/dp_16" />
+
+    </RelativeLayout>
+
+    <View style="@style/line_style" />
+    <!--此部分需要完整复制过去,删减或者更改ID会导致初始化找不到内容而报空-->
+    <LinearLayout
+        android:id="@+id/timepicker"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dp_200"
+        android:background="@android:color/white"
+        android:gravity="center"
+        android:minHeight="150dp"
+        android:orientation="horizontal">
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/year"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1" />
+
+        <com.contrarywind.view.WheelView
+
+            android:id="@+id/month"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1.1" />
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/day"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1.1" />
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/hour"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1.1" />
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/min"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1.1" />
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/second"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1.1" />
+    </LinearLayout>
+
+
+</LinearLayout>

+ 13 - 0
BaseLibrary/src/main/res/values/attrs.xml

@@ -12,4 +12,17 @@
         <attr name="labelText" format="string"/>
         <attr name="contentText" format="string"/>
     </declare-styleable>
+
+    <declare-styleable name="QMUIRadiusImageView">
+        <attr name="qmui_border_width" format="dimension"/>
+        <attr name="qmui_border_color" format="color"/>
+        <attr name="qmui_selected_mask_color" format="color"/>
+        <attr name="qmui_selected_border_color" format="color"/>
+        <attr name="qmui_selected_border_width" format="dimension"/>
+        <attr name="qmui_corner_radius" format="dimension"/>
+        <attr name="qmui_is_oval" format="boolean"/>
+        <attr name="qmui_is_circle" format="boolean"/>
+        <attr name="qmui_is_touch_select_mode_enabled" format="boolean"/>
+    </declare-styleable>
+    <attr name="QMUIRadiusImageViewStyle" format="reference"/>
 </resources>

+ 8 - 1
BaseLibrary/src/main/res/values/colors.xml

@@ -17,7 +17,8 @@
     <color name="common_yellow">#fe9c2f</color>
     <color name="gray_AA">#AAAAAA</color>
     <color name="black_444">#ff444444</color>
-    <color name="gray_777">#777777</color>E
+    <color name="gray_777">#777777</color>
+    <color name="white">#ffffff</color>
 
     <color name="text_dark">#999999</color>
     <color name="text_light_dark">#333333</color>
@@ -31,9 +32,15 @@
     <color name="color_ffc1c1c1">#FFC1C1C1</color>
     <color name="color_999999">#999999</color>
     <color name="color_333333">#333333</color>
+    <color name="color_666666">#666666</color>
     <color name="color_2dc7aa">#2DC7AA</color>
     <color name="color_283240">#283240</color>
     <color name="color_808492">#808492</color>
     <color name="color_f8f9fc">#f8f9fc</color>
     <color name="color_f2f2f2">#F2F2F2</color>
+    <color name="color_1a1a1a">#1A1A1A</color>
+    <color name="color_ff8c00">#FF8C00</color>
+    <color name="color_fff1de">#FFF1DE</color>
+    <color name="color_d3d3d3">#D3D3D3</color>
+    <color name="color_6a6a6a">#6A6A6A</color>
 </resources>

+ 6 - 0
BaseLibrary/src/main/res/values/styles.xml

@@ -156,4 +156,10 @@
         <item name="android:textStyle">normal</item>
         <item name="android:textSize">@dimen/sp_10</item>
     </style>
+
+    <style name="line_style">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">1dp</item>
+        <item name="android:background">@color/divide_color</item>
+    </style>
 </resources>

+ 80 - 6
teacher/src/main/java/com/cooleshow/teacher/adapter/CourseTableListAdapter.kt

@@ -1,18 +1,92 @@
 package com.cooleshow.teacher.adapter
 
+import android.text.TextUtils
+import android.view.View
+import android.widget.ImageView
+import android.widget.TextView
 import com.chad.library.adapter.base.BaseQuickAdapter
-import com.cooleshow.teacher.bean.CourseTableListBean
 import com.chad.library.adapter.base.viewholder.BaseViewHolder
-import android.widget.TextView
+import com.cooleshow.base.ext.setVisible
+import com.cooleshow.base.utils.GlideUtils
 import com.cooleshow.teacher.R
+import com.cooleshow.teacher.bean.CourseTableDataBean
 
 /**
  * Author by pq, Date on 2022/4/21.
  */
 class CourseTableListAdapter(layoutResId: Int) :
-    BaseQuickAdapter<CourseTableListBean?, BaseViewHolder>(layoutResId) {
-    override fun convert(baseViewHolder: BaseViewHolder, o: CourseTableListBean?) {
-        val text = baseViewHolder.getView<TextView>(R.id.text)
-        text.text = "position:" + baseViewHolder.layoutPosition
+    BaseQuickAdapter<CourseTableDataBean.StudentListBean?, BaseViewHolder>(layoutResId) {
+    val LIVE_COURSE = "LIVE_COURSE"
+    val OTHER_COURSE = "PRACTICE"
+    val NOT_START = "NOT_START"
+    val ING = "ING"
+    val COMPLETE = "COMPLETE"
+    val CANCEL = "CANCEL"
+    override fun convert(
+        baseViewHolder: BaseViewHolder,
+        data: CourseTableDataBean.StudentListBean?
+    ) {
+        val tvTime = baseViewHolder.getView<TextView>(R.id.tv_time)
+        val ivAvatar = baseViewHolder.getView<ImageView>(R.id.iv_avatar)
+        val viewLine2 = baseViewHolder.getView<View>(R.id.view_line2)
+        val tvBuyNum = baseViewHolder.getView<TextView>(R.id.tv_buy_num)
+        val tvCourseStatusBt = baseViewHolder.getView<TextView>(R.id.tv_course_status_bt)
+        //开始时间
+        tvTime.text = data?.startTime;
+        //title
+        baseViewHolder.setText(R.id.tv_title, data?.name);
+        //subjectName
+        baseViewHolder.setText(R.id.tv_course_name, data?.subjectName);
+        if (TextUtils.equals(OTHER_COURSE, data?.courseType)) {
+            //陪练课
+            GlideUtils.loadImage(
+                context,
+                data!!.avatar,
+                ivAvatar,
+                R.drawable.icon_teacher_default_head
+            )
+            viewLine2.setVisible(false)
+            tvBuyNum.setVisible(false)
+        } else {
+            //直播课
+            ivAvatar.setImageResource(R.drawable.icon_live_bg)
+            var payCount = data?.payCount
+            //已购人数
+            tvBuyNum.text = context.getString(R.string.pay_count_str, payCount)
+            viewLine2.setVisible(true)
+            tvBuyNum.setVisible(true)
+        }
+        when (data?.status) {
+            NOT_START -> {
+                //未开始
+                if (TextUtils.equals(OTHER_COURSE, data?.courseType)) {
+                    tvCourseStatusBt.setVisible(true)
+                } else {
+                    //直播课隐藏
+                    tvCourseStatusBt.setVisible(false)
+                }
+                baseViewHolder.setText(R.id.tv_course_status, "未开始")
+                tvCourseStatusBt.text = "调课"
+                tvCourseStatusBt.setBackgroundResource(R.drawable.shape_course_status_normal);
+                tvCourseStatusBt.setTextColor(context.resources.getColor(com.cooleshow.base.R.color.color_2dc7aa))
+            }
+            ING -> {
+                //进行中
+                tvCourseStatusBt.setVisible(true)
+                tvCourseStatusBt.text = "进入教室"
+                baseViewHolder.setText(R.id.tv_course_status, "进行中")
+                tvCourseStatusBt.setBackgroundResource(R.drawable.shape_course_status_ing);
+                tvCourseStatusBt.setTextColor(context.resources.getColor(R.color.white))
+
+            }
+            COMPLETE -> {
+                //已完成
+                tvCourseStatusBt.setVisible(true)
+                tvCourseStatusBt.text = "评价"
+                baseViewHolder.setText(R.id.tv_course_status, "已结束")
+                tvCourseStatusBt.setBackgroundResource(R.drawable.shape_course_status_normal);
+                tvCourseStatusBt.setTextColor(context.resources.getColor(com.cooleshow.base.R.color.color_2dc7aa))
+            }
+        }
     }
 }

+ 4 - 3
teacher/src/main/java/com/cooleshow/teacher/api/APIService.java

@@ -1,6 +1,7 @@
 package com.cooleshow.teacher.api;
 
 import com.cooleshow.base.data.net.BaseResponse;
+import com.cooleshow.teacher.bean.CourseTableDataBean;
 
 import java.util.List;
 
@@ -29,9 +30,9 @@ public interface APIService {
     /**
      * 根据日期获取老师当日排课
      *
-     * @param date
+     * @param
      * @return
      */
-    @GET(TEACHER_GROUP + "courseSchedule/queryCourseUser")
-    Observable<BaseResponse<Object>> getCourseSchedulesWithDate(@Query("date") String date);
+    @POST(TEACHER_GROUP + "courseSchedule/queryCourseUser")
+    Observable<BaseResponse<CourseTableDataBean>> getCourseSchedulesWithDate(@Body RequestBody body);
 }

+ 65 - 0
teacher/src/main/java/com/cooleshow/teacher/bean/CourseTableDataBean.java

@@ -0,0 +1,65 @@
+package com.cooleshow.teacher.bean;
+
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2022/4/21.
+ */
+public class CourseTableDataBean {
+
+    /**
+     * sysConfig : {"liveEndTime":"10","practiceStartTime":"5","practiceEndTime":"5","liveStartTime":"20"}
+     * studentList : [{"endTime":"2022-03-26 12:24:57","status":"COMPLETE","startTime":"2022-03-26 11:24:53","userId":"44","subjectId":1,"courseGoupId":1,"avatar":"","courseType":"PRACTICE","subjectName":"西洋管乐","courseId":1,"classDate":"2022-03-26 00:00:00","cover":"https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png","payCount":"","name":"cy"}]
+     */
+
+    public SysConfigBean sysConfig;
+    public List<StudentListBean> studentList;
+
+    public static class SysConfigBean {
+        /**
+         * liveEndTime : 10
+         * practiceStartTime : 5
+         * practiceEndTime : 5
+         * liveStartTime : 20
+         */
+
+        public String liveEndTime;
+        public String practiceStartTime;
+        public String practiceEndTime;
+        public String liveStartTime;
+    }
+
+    public static class StudentListBean {
+        /**
+         * endTime : 2022-03-26 12:24:57
+         * status : COMPLETE
+         * startTime : 2022-03-26 11:24:53
+         * userId : 44
+         * subjectId : 1
+         * courseGoupId : 1
+         * avatar :
+         * courseType : PRACTICE
+         * subjectName : 西洋管乐
+         * courseId : 1
+         * classDate : 2022-03-26 00:00:00
+         * cover : https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png
+         * payCount :
+         * name : cy
+         */
+
+        public String endTime;
+        public String status;
+        public String startTime;
+        public String userId;
+        public int subjectId;
+        public int courseGoupId;
+        public String avatar;
+        public String courseType;
+        public String subjectName;
+        public int courseId;
+        public String classDate;
+        public String cover;
+        public String payCount;
+        public String name;
+    }
+}

+ 0 - 7
teacher/src/main/java/com/cooleshow/teacher/bean/CourseTableListBean.java

@@ -1,7 +0,0 @@
-package com.cooleshow.teacher.bean;
-
-/**
- * Author by pq, Date on 2022/4/21.
- */
-public class CourseTableListBean {
-}

+ 2 - 0
teacher/src/main/java/com/cooleshow/teacher/contract/CourseTableContract.java

@@ -1,6 +1,7 @@
 package com.cooleshow.teacher.contract;
 
 import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.teacher.bean.CourseTableDataBean;
 
 import java.util.Date;
 import java.util.List;
@@ -12,6 +13,7 @@ public interface CourseTableContract {
 
     interface CourseTableView extends BaseView {
         void onGetCourseDateByMonthSuccess(List<String> datas);
+        void onGetCourseSchedulesWithDateSuccess(CourseTableDataBean courseTableDataBean);
     }
 
     interface Presenter {

+ 25 - 5
teacher/src/main/java/com/cooleshow/teacher/presenter/main/CourseTablePresenter.java

@@ -4,8 +4,10 @@ import com.cooleshow.base.data.net.BaseResponse;
 import com.cooleshow.base.presenter.BasePresenter;
 import com.cooleshow.base.rx.BaseObserver;
 import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.base.utils.TimeUtils;
 import com.cooleshow.teacher.BuildConfig;
 import com.cooleshow.teacher.api.APIService;
+import com.cooleshow.teacher.bean.CourseTableDataBean;
 import com.cooleshow.teacher.contract.CourseTableContract;
 
 import org.json.JSONException;
@@ -18,7 +20,6 @@ import java.util.List;
  * Author by pq, Date on 2022/4/21.
  */
 public class CourseTablePresenter extends BasePresenter<CourseTableContract.CourseTableView> implements CourseTableContract.Presenter {
-
     /**
      * 查询当月有课的日期
      *
@@ -26,13 +27,16 @@ public class CourseTablePresenter extends BasePresenter<CourseTableContract.Cour
      */
     @Override
     public void getCourseScheduleDateByMonth(String month) {
-        JSONObject jsonObject =new JSONObject();
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
         try {
-            jsonObject.putOpt("classMonth",month);
+            jsonObject.putOpt("classMonth", month);
         } catch (JSONException e) {
             e.printStackTrace();
         }
-        addSubscribe(create(APIService.class).getCourseScheduleDateByMonth(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<List<String>>() {
+        addSubscribe(create(APIService.class).getCourseScheduleDateByMonth(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<List<String>>(getView()) {
             @Override
             protected void onSuccess(List<String> data) {
                 if (getView() != null) {
@@ -49,6 +53,22 @@ public class CourseTablePresenter extends BasePresenter<CourseTableContract.Cour
      */
     @Override
     public void getCourseSchedulesWithDate(Date date) {
-
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("classDate", TimeUtils.date2String(date, TimeUtils.getSafeDateFormat("yyyy-MM-dd")));
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(APIService.class).getCourseSchedulesWithDate(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<CourseTableDataBean>(getView()) {
+            @Override
+            protected void onSuccess(CourseTableDataBean data) {
+                if (getView() != null) {
+                    getView().onGetCourseSchedulesWithDateSuccess(data);
+                }
+            }
+        });
     }
 }

+ 114 - 10
teacher/src/main/java/com/cooleshow/teacher/ui/main/CourseTableFragment.kt

@@ -1,9 +1,15 @@
 package com.cooleshow.teacher.ui.main
 
+import android.view.LayoutInflater
 import android.view.MotionEvent
 import android.view.View
+import android.widget.TextView
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
+import com.bigkoo.pickerview.builder.TimePickerBuilder
+import com.bigkoo.pickerview.listener.CustomListener
+import com.bigkoo.pickerview.listener.OnTimeSelectListener
+import com.bigkoo.pickerview.view.TimePickerView
 import com.chad.library.adapter.base.listener.OnItemClickListener
 import com.cooleshow.base.ui.fragment.BaseMVPFragment
 import com.cooleshow.base.utils.SizeUtils
@@ -11,16 +17,16 @@ import com.cooleshow.base.utils.TimeUtils
 import com.cooleshow.base.utils.ToastUtils
 import com.cooleshow.teacher.R
 import com.cooleshow.teacher.adapter.CourseTableListAdapter
-import com.cooleshow.teacher.bean.CourseTableListBean
+import com.cooleshow.teacher.bean.CourseTableDataBean
 import com.cooleshow.teacher.contract.CourseTableContract
 import com.cooleshow.teacher.contract.HomeContract
 import com.cooleshow.teacher.databinding.FragmentCourseTableLayoutBinding
 import com.cooleshow.teacher.presenter.main.CourseTablePresenter
-import com.cooleshow.teacher.presenter.main.HomePresenter
 import com.cooleshow.teacher.widgets.CalendarExpandDecoration
 import com.cooleshow.teacher.widgets.CalendarShrinkDecoration
 import com.haibin.calendarview.CalendarView
 import kotlinx.android.synthetic.main.fragment_course_table_layout.*
+import org.w3c.dom.Text
 import java.util.*
 
 
@@ -31,12 +37,15 @@ class CourseTableFragment :
     BaseMVPFragment<FragmentCourseTableLayoutBinding, CourseTablePresenter>(),
     HomeContract.HomeView, CalendarView.OnCalendarSelectListener,
     CalendarView.OnCalendarInterceptListener, CalendarView.OnMonthChangeListener,
-    CalendarView.OnViewChangeListener, CourseTableContract.CourseTableView {
-    private lateinit var date: Date
+    CalendarView.OnViewChangeListener, CourseTableContract.CourseTableView, View.OnClickListener {
+    private lateinit var currentSelectDate: Date
     private lateinit var calendarDate: String
     private lateinit var calendarExpandDecoration: CalendarExpandDecoration
     private lateinit var calendarShrinkDecoration: CalendarShrinkDecoration
     private lateinit var adapter: CourseTableListAdapter
+    private lateinit var pvTime: TimePickerView
+    private lateinit var emptyView: View
+    private lateinit var emptyText: TextView
     private var day: Int = -1;
 
     override fun getLayoutView(): FragmentCourseTableLayoutBinding {
@@ -50,6 +59,7 @@ class CourseTableFragment :
         mViewBinding.calendarView.setOnViewChangeListener(this)
         calendarExpandDecoration = CalendarExpandDecoration(context)
         calendarShrinkDecoration = CalendarShrinkDecoration(context)
+        mViewBinding.tvCurrentDate.setOnClickListener(this)
         val layoutManager = LinearLayoutManager(
             activity
         )
@@ -91,9 +101,9 @@ class CourseTableFragment :
     }
 
     private fun addTestData() {
-        var list = mutableListOf<CourseTableListBean?>()
+        var list = mutableListOf<CourseTableDataBean.StudentListBean?>()
         for (i in 0 until 20) {
-            list.add(CourseTableListBean())
+            list.add(CourseTableDataBean.StudentListBean())
         }
         adapter.setNewInstance(list)
     }
@@ -107,15 +117,14 @@ class CourseTableFragment :
         val year = calendar[Calendar.YEAR]
         val month = calendar[Calendar.MONTH] + 1
         day = calendar[Calendar.DAY_OF_MONTH]
-        if ((mViewBinding.calendarView.getCurDay() !== day || mViewBinding.calendarView.getCurMonth() !== month || mViewBinding.calendarView.getCurYear() !== year)) {
+        if ((mViewBinding.calendarView.curDay !== day || mViewBinding.calendarView.curMonth !== month || mViewBinding.calendarView.curYear !== year)) {
             mViewBinding.calendarView.updateCurrentDate()
             mViewBinding.calendarView.clearSingleSelect()
         }
         setMontAndDay(year, month, day)
-        date = TimeUtils.getNowDate()
+        currentSelectDate = TimeUtils.getNowDate()
         calendarDate = TimeUtils.getNowString(TimeUtils.getSafeDateFormat("yyyy-MM"))
-        presenter.getCourseScheduleDateByMonth(calendarDate)
-        presenter.getCourseSchedulesWithDate(date)
+        queryCurrentDataCourse()
     }
 
     private fun setMontAndDay(year: Int, month: Int, day: Int) {
@@ -134,7 +143,19 @@ class CourseTableFragment :
         val year = calendar!!.year
         val month = calendar!!.month
         val day = calendar!!.day
+        currentSelectDate = TimeUtils.millis2Date(calendar.timeInMillis)
+        calendarDate =
+            TimeUtils.date2String(currentSelectDate, TimeUtils.getSafeDateFormat("yyyy-MM"))
         setMontAndDay(year, month, day)
+        queryCurrentDataCourse()
+    }
+
+    /**
+     * 查询当前选择日期的课程
+     */
+    private fun queryCurrentDataCourse() {
+        presenter.getCourseScheduleDateByMonth(calendarDate)
+        presenter.getCourseSchedulesWithDate(currentSelectDate)
     }
 
     override fun onCalendarIntercept(calendar: com.haibin.calendarview.Calendar?): Boolean {
@@ -145,6 +166,7 @@ class CourseTableFragment :
         calendar: com.haibin.calendarview.Calendar?,
         isClick: Boolean
     ) {
+
     }
 
     override fun onMonthChange(year: Int, month: Int) {
@@ -177,7 +199,89 @@ class CourseTableFragment :
             return;
         }
         if (datas?.size != 0) {
+            //更新日历表,显示有课字样
+        }
+    }
+
+    /**
+     * 查询当天的课程
+     */
+    override fun onGetCourseSchedulesWithDateSuccess(data: CourseTableDataBean) {
+        if (isDetached) {
+            return;
+        }
+        adapter?.data.clear()
+        if (data?.studentList?.size != 0) {
+            //更新日历表,显示有课字样
+            adapter.data.addAll(data?.studentList);
+            adapter?.notifyDataSetChanged()
+        } else {
+            //show空视图
+            adapter?.notifyDataSetChanged()
+            showEmptyView()
+        }
+    }
+
+    private fun showEmptyView() {
+        if (!::emptyView.isInitialized) {
+            emptyView = LayoutInflater.from(requireContext())
+                .inflate(com.cooleshow.base.R.layout.empty_layout, adapter?.emptyLayout, false)
+            emptyText = emptyView.findViewById<TextView>(com.cooleshow.base.R.id.tv_empty_tip)
+        }
+        emptyText.text = "暂无数据"
+        adapter?.setEmptyView(emptyView)
+    }
 
+    override fun onClick(v: View?) {
+        when (v?.id) {
+            R.id.tv_current_date -> {
+                showTimeSelectView()
+            }
         }
     }
+
+    /**
+     * 显示日期选择view
+     */
+    private fun showTimeSelectView() {
+        //正确设置方式 原因:注意事项有说明
+        if (!::pvTime.isInitialized) {
+            pvTime = TimePickerBuilder(
+                requireContext(),
+                OnTimeSelectListener { date: Date?, v: View? ->  //选中事件回调
+                    var year: Int = TimeUtils.getValueByCalendarField(date, Calendar.YEAR)
+                    var month: Int = TimeUtils.getValueByCalendarField(date, Calendar.MONTH) + 1
+                    var day: Int = TimeUtils.getValueByCalendarField(date, Calendar.DAY_OF_MONTH)
+                    mViewBinding.calendarView.scrollToCalendar(year, month, day);
+                }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_default_layout,
+                CustomListener { v -> //自定义布局中的控件初始化及事件处理
+                    val tvSubmit =
+                        v.findViewById<View>(com.cooleshow.base.R.id.tv_finish) as TextView
+                    val ivCancel =
+                        v.findViewById<View>(com.cooleshow.base.R.id.tv_cancel) as TextView
+                    tvSubmit.setOnClickListener {
+                        pvTime.returnData()
+                        pvTime.dismiss()
+                    }
+                    ivCancel.setOnClickListener { pvTime.dismiss() }
+                })
+                .setLineSpacingMultiplier(2.5f)
+                .setType(booleanArrayOf(true, true, true, false, false, false)) // 默认全部显示
+                .isCyclic(true) //是否循环滚动
+                .setOutSideCancelable(true) //点击屏幕,点在控件外部范围时,是否取消显示
+                .setTextColorCenter(resources.getColor(com.cooleshow.base.R.color.color_1a1a1a)) //设置选中项的颜色
+//            .setRangDate(null, endDate) //起始终止年月日设定
+//            .setDate(endDate)
+                .isDialog(false) //是否显示为对话框样式
+                .setLabel("年", "月", "日", "", "", "")
+                .build()
+        }
+        var calendar = Calendar.getInstance();
+        calendar.time = currentSelectDate
+        pvTime.setDate(calendar)
+        if (!pvTime.isShowing) {
+            pvTime.show()
+        }
+
+    }
 }

BIN
teacher/src/main/res/drawable-xhdpi/icon_chat_small.png


BIN
teacher/src/main/res/drawable-xhdpi/icon_clock.png


BIN
teacher/src/main/res/drawable-xhdpi/icon_live_bg.png


BIN
teacher/src/main/res/drawable-xxhdpi/icon_chat_small.png


BIN
teacher/src/main/res/drawable-xxhdpi/icon_clock.png


BIN
teacher/src/main/res/drawable-xxhdpi/icon_live_bg.png


BIN
teacher/src/main/res/drawable-xxhdpi/icon_teacher_default_head.png


+ 5 - 0
teacher/src/main/res/drawable/shape_course_status_ing.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/color_2dc7aa" />
+    <corners android:radius="22dp"/>
+</shape>

+ 6 - 0
teacher/src/main/res/drawable/shape_course_status_normal.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <stroke android:color="@color/color_2dc7aa"
+        android:width="1dp"/>
+    <corners android:radius="22dp"/>
+</shape>

+ 5 - 0
teacher/src/main/res/drawable/shape_couse_type_text_bg.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/color_fff1de"/>
+    <corners android:radius="4dp"/>
+</shape>

+ 140 - 5
teacher/src/main/res/layout/item_course_table_layout.xml

@@ -1,11 +1,146 @@
 <?xml version="1.0" encoding="utf-8"?>
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content">
+    android:layout_height="wrap_content"
+    android:layout_marginStart="14dp"
+    android:layout_marginTop="12dp"
+    android:layout_marginEnd="14dp"
+    android:background="@drawable/bg_white_10dp"
+    android:paddingStart="11dp"
+    android:paddingEnd="11dp"
+    android:paddingBottom="20dp">
+
+    <ImageView
+        android:id="@+id/iv_clock_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="11dp"
+        android:src="@drawable/icon_clock"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
     <TextView
-        android:textColor="@color/color_999999"
-        android:textSize="@dimen/sp_18"
-        android:id="@+id/text"
+        android:id="@+id/tv_time"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="6dp"
+        android:includeFontPadding="false"
+        android:textColor="@color/color_666666"
+        android:textSize="@dimen/sp_13"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_clock_icon"
+        app:layout_constraintLeft_toRightOf="@+id/iv_clock_icon"
+        app:layout_constraintTop_toTopOf="@+id/iv_clock_icon"
+        tools:text="2021/09/17 14:00~14:25" />
+
+    <View
+        android:id="@+id/view_line"
+        android:layout_width="0dp"
+        android:layout_height="1dp"
+        android:layout_marginTop="10dp"
+        android:background="@color/color_f2f2f2"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/iv_clock_icon" />
+
+    <com.cooleshow.base.widgets.QMUIRadiusImageView
+        android:id="@+id/iv_avatar"
+        android:layout_width="47dp"
+        android:layout_height="51dp"
+        android:layout_marginTop="17dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/view_line"
+        app:qmui_corner_radius="5dp" />
+
+    <TextView
+        android:id="@+id/tv_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="10dp"
+        android:includeFontPadding="false"
+        android:textColor="@color/color_1a1a1a"
+        android:textSize="@dimen/sp_16"
+        android:textStyle="bold"
+        app:layout_constraintBottom_toTopOf="@+id/tv_course_name"
+        app:layout_constraintLeft_toRightOf="@+id/iv_avatar"
+        app:layout_constraintTop_toTopOf="@+id/iv_avatar"
+        app:layout_constraintVertical_chainStyle="packed"
+        tools:text="张豆豆" />
+
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="5dp"
+        android:src="@drawable/icon_chat_small"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_title"
+        app:layout_constraintLeft_toRightOf="@+id/tv_title"
+        app:layout_constraintTop_toTopOf="@+id/tv_title" />
+
+    <TextView
+        android:id="@+id/tv_course_name"
         android:layout_width="wrap_content"
-        android:layout_height="50dp"/>
+        android:layout_height="wrap_content"
+        android:layout_marginTop="8dp"
+        android:background="@drawable/shape_couse_type_text_bg"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:paddingStart="4dp"
+        android:paddingTop="2dp"
+        android:paddingEnd="4dp"
+        android:paddingBottom="2dp"
+        android:textColor="@color/color_ff8c00"
+        android:textSize="@dimen/sp_11"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_avatar"
+        app:layout_constraintLeft_toLeftOf="@+id/tv_title"
+        app:layout_constraintTop_toBottomOf="@+id/tv_title"
+        tools:text="单簧管" />
+
+    <View
+        android:id="@+id/view_line2"
+        android:layout_width="1dp"
+        android:layout_height="11dp"
+        android:layout_marginStart="8dp"
+        android:background="@color/color_d3d3d3"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_course_name"
+        app:layout_constraintLeft_toRightOf="@+id/tv_course_name"
+        app:layout_constraintTop_toTopOf="@+id/tv_course_name" />
+
+    <TextView
+        android:id="@+id/tv_buy_num"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:textColor="@color/color_6a6a6a"
+        android:textSize="@dimen/sp_11"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="@+id/view_line2"
+        app:layout_constraintLeft_toRightOf="@+id/view_line2"
+        app:layout_constraintTop_toTopOf="@+id/view_line2"
+        tools:text="6人已购买" />
+
+    <TextView
+        android:id="@+id/tv_course_status"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textColor="@color/color_999999"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintBottom_toTopOf="@+id/view_line"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="未开始" />
+
+    <TextView
+        android:id="@+id/tv_course_status_bt"
+        android:layout_width="70dp"
+        android:layout_height="28dp"
+        android:background="@drawable/shape_course_status_normal"
+        android:gravity="center"
+        android:textColor="@color/color_2dc7aa"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        tools:text="调课" />
+
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 1 - 0
teacher/src/main/res/values/strings.xml

@@ -5,4 +5,5 @@
     <string name="menu_chat">聊天</string>
     <string name="menu_mall">商城</string>
     <string name="menu_mine">我的</string>
+    <string name="pay_count_str">%1$s人已购买</string>
 </resources>

+ 1 - 1
usercenter/src/main/res/layout/activity_login.xml

@@ -52,7 +52,7 @@
         android:background="@null"
         android:hint="@string/please_input_phone_num"
         android:inputType="phone"
-        android:text="18086531408"
+        android:text="13627281518"
         android:textColorHint="@color/color_ffc1c1c1"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent"