diff --git a/OrangeSale_02/.gitignore b/OrangeSale_02/.gitignore
new file mode 100644
index 0000000..aa724b7
--- /dev/null
+++ b/OrangeSale_02/.gitignore
@@ -0,0 +1,15 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/OrangeSale_02/.idea/.gitignore b/OrangeSale_02/.idea/.gitignore
new file mode 100644
index 0000000..359bb53
--- /dev/null
+++ b/OrangeSale_02/.idea/.gitignore
@@ -0,0 +1,3 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
diff --git a/OrangeSale_02/.idea/compiler.xml b/OrangeSale_02/.idea/compiler.xml
new file mode 100644
index 0000000..fb7f4a8
--- /dev/null
+++ b/OrangeSale_02/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/.idea/gradle.xml b/OrangeSale_02/.idea/gradle.xml
new file mode 100644
index 0000000..a2d7c21
--- /dev/null
+++ b/OrangeSale_02/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/.idea/misc.xml b/OrangeSale_02/.idea/misc.xml
new file mode 100644
index 0000000..bdd9278
--- /dev/null
+++ b/OrangeSale_02/.idea/misc.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/.idea/vcs.xml b/OrangeSale_02/.idea/vcs.xml
new file mode 100644
index 0000000..6c0b863
--- /dev/null
+++ b/OrangeSale_02/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/.gitignore b/OrangeSale_02/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/OrangeSale_02/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/OrangeSale_02/app/build.gradle b/OrangeSale_02/app/build.gradle
new file mode 100644
index 0000000..16ed8e2
--- /dev/null
+++ b/OrangeSale_02/app/build.gradle
@@ -0,0 +1,55 @@
+plugins {
+ id 'com.android.application'
+}
+
+android {
+ namespace 'com.example.orangesale_02'
+ compileSdk 33
+
+ defaultConfig {
+ applicationId "com.example.orangesale_02"
+ minSdk 21
+ targetSdk 33
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.5.1'
+ implementation 'com.google.android.material:material:1.7.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+ implementation 'androidx.databinding:databinding-runtime:7.1.2'
+
+ testImplementation 'junit:junit:4.13.2'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.4'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
+
+ implementation 'com.github.yijiebuyi:3DWheelPicker:v1.2.0' //选择器
+ //Gson解析
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //热门强大的图片加载器
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
+
+ //下拉刷新框架
+ implementation 'io.github.scwang90:refresh-layout-kernel:2.0.5' //core
+ implementation 'io.github.scwang90:refresh-header-classics:2.0.5' //经典刷新头
+
+ implementation 'se.emilsjolander:stickylistheaders:2.7.0'
+
+}
\ No newline at end of file
diff --git a/OrangeSale_02/app/proguard-rules.pro b/OrangeSale_02/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/OrangeSale_02/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/androidTest/java/com/example/orangesale_02/ExampleInstrumentedTest.java b/OrangeSale_02/app/src/androidTest/java/com/example/orangesale_02/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..6450772
--- /dev/null
+++ b/OrangeSale_02/app/src/androidTest/java/com/example/orangesale_02/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.example.orangesale_02;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("com.example.orangesale_02", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/AndroidManifest.xml b/OrangeSale_02/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..88ae98d
--- /dev/null
+++ b/OrangeSale_02/app/src/main/AndroidManifest.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/AdministrativeMap.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/AdministrativeMap.java
new file mode 100644
index 0000000..c18e518
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/AdministrativeMap.java
@@ -0,0 +1,67 @@
+package com.example.orangesale_02;
+
+import com.wheelpicker.widget.PickString;
+
+import java.util.List;
+/**
+ * 城市选择器自定义类
+ */
+public class AdministrativeMap {
+ public int year;
+ public List provinces;
+
+ /**
+ * 省
+ */
+ public static class Province implements PickString {
+ public String name;
+ public String code;
+ public List city;
+
+ @Override
+ public String pickDisplayName() {
+ return name;
+ }
+ }
+
+ /**
+ * 市
+ */
+ public static class City implements PickString{
+ public String name;
+ public String code;
+ public List areas;
+
+ @Override
+ public String pickDisplayName() {
+ return name;
+ }
+ }
+
+ /**
+ * 区县
+ */
+ public static class Area implements PickString{
+ public String name;
+ public String code;
+ public List countries;
+
+ @Override
+ public String pickDisplayName() {
+ return name;
+ }
+ }
+
+ /**
+ * 乡镇
+ */
+ public static class Country implements PickString{
+ public String name;
+ public String code;
+
+ @Override
+ public String pickDisplayName() {
+ return name;
+ }
+ }
+}
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/CustomLayout/DPIUtil.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/CustomLayout/DPIUtil.java
new file mode 100644
index 0000000..b329578
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/CustomLayout/DPIUtil.java
@@ -0,0 +1,130 @@
+package com.example.orangesale_02.CustomLayout;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Point;
+import android.view.Display;
+import android.view.WindowManager;
+
+public class DPIUtil {
+
+ private static float mDensity = 160.0F;
+ private static Display defaultDisplay;
+ private static Point outSize = null;
+
+ public DPIUtil() {
+ }
+
+
+ public static void setDensity(float var0) {
+ mDensity = var0;
+ }
+
+ public static float getDensity() {
+ return mDensity;
+ }
+
+ public static Display getDefaultDisplay(Context var0) {
+ if (null == defaultDisplay) {
+ WindowManager var1 = (WindowManager)var0.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
+ defaultDisplay = var1.getDefaultDisplay();
+ }
+
+ return defaultDisplay;
+ }
+
+ public static int dip2px(float var0) {
+ return (int)(var0 * mDensity + 0.5F);
+ }
+
+ public static int px2dip(float var0) {
+ return (int)(var0 / mDensity + 0.5F);
+ }
+
+ public static int getWidth(Context var0) {
+ if (outSize == null) {
+ Class var1 = DPIUtil.class;
+ synchronized(DPIUtil.class) {
+ if (outSize == null) {
+ getPxSize(var0);
+ }
+ }
+ }
+
+ return outSize.x;
+ }
+
+ public static int getAppWidth(Activity var0) {
+ if (var0 != null) {
+ try {
+ Point var5 = new Point();
+ var0.getWindowManager().getDefaultDisplay().getSize(var5);
+ return var5.x;
+ } catch (Exception var4) {
+ var4.printStackTrace();
+ }
+ }
+
+ if (outSize == null) {
+ Class var1 = DPIUtil.class;
+ synchronized(DPIUtil.class) {
+ if (outSize == null) {
+ getPxSize(var0.getApplicationContext());
+ }
+ }
+ }
+
+ return outSize.x;
+ }
+
+ public static int getHeight(Context var0) {
+ Display var1 = getDefaultDisplay(var0);
+ Point var2 = new Point();
+ var1.getSize(var2);
+ return var2.y;
+ }
+
+ public static int getAppHeight(Activity var0) {
+ if (var0 != null) {
+ try {
+ Point var5 = new Point();
+ var0.getWindowManager().getDefaultDisplay().getSize(var5);
+ return var5.y;
+ } catch (Exception var4) {
+ var4.printStackTrace();
+ }
+ }
+
+ if (outSize == null) {
+ Class var1 = DPIUtil.class;
+ synchronized(DPIUtil.class) {
+ if (outSize == null && var0 != null) {
+ getPxSize(var0.getApplicationContext());
+ }
+ }
+ }
+
+ return outSize.y;
+ }
+
+ public static int px2sp(Context var0, float var1) {
+ float var2 = var0.getResources().getDisplayMetrics().scaledDensity;
+ return (int)(var1 / var2 + 0.5F);
+ }
+
+ public static int sp2px(Context var0, float var1) {
+ float var2 = var0.getResources().getDisplayMetrics().scaledDensity;
+ return (int)((var1 - 0.5F) * var2);
+ }
+
+ public static int dip2px(Context var0, float var1) {
+ float var2 = var0.getResources().getDisplayMetrics().density;
+ return (int)(var1 * var2 + 0.5F);
+ }
+
+ public static void getPxSize(Context var0) {
+ Display var1 = getDefaultDisplay(var0);
+ outSize = new Point();
+ var1.getSize(outSize);
+ }
+}
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/CustomLayout/LeftSlideView.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/CustomLayout/LeftSlideView.java
new file mode 100644
index 0000000..f03e298
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/CustomLayout/LeftSlideView.java
@@ -0,0 +1,408 @@
+package com.example.orangesale_02.CustomLayout;
+
+import android.animation.ValueAnimator;
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.graphics.Color;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+
+import androidx.cardview.widget.CardView;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.viewpager.widget.ViewPager;
+
+/**
+ * 左滑删除容器
+ */
+public class LeftSlideView extends LinearLayout {
+
+ public static final String TAG = "LeftSlideView"; //tag
+ private final Context mContext;
+ private int mTouchSlop;//最小触摸距离
+ private int mRightCanSlide; //右边可滑动距离
+ private float mInitX;//按下x
+ private float mInitY;//按下y
+ private ValueAnimator mValueAnimator;//属性动画
+ private final int mAnimDuring = 200;//动画时长
+ private final int mDelLength = 76;//删除按钮的长度
+ private ViewPager mViewPager;
+ private RecyclerView mRecyclerView;
+ private CardView mCardView;
+ private boolean isReCompute = true;
+ private OnDelViewStatusChangeLister mStatusChangeLister;//状态监听
+
+ /************************************ View *********************************************/
+ public LeftSlideView(Context context) {
+ super(context);
+ this.mContext = context;
+ init();
+ }
+ /**
+ * 初始化
+ */
+ private void init() {
+ mTouchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop();
+ mRightCanSlide = DPIUtil.dip2px(mContext, mDelLength);
+ setBackgroundColor(Color.TRANSPARENT);
+ // 水平布局
+ setOrientation(LinearLayout.HORIZONTAL);
+ initView();
+ }
+
+ /**
+ * 初始化View
+ */
+ private void initView() {
+ }
+
+ /**
+ * 设置内容区域
+ */
+ public void addContentView(View contentView) {
+ //内容区域View
+ contentView.setTag("contentView");
+
+ View cv = findViewWithTag("contentView");
+ if (cv != null) {
+ this.removeView(cv);
+ }
+ LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT
+ );
+ this.addView(contentView, layoutParams);
+ }
+
+ /**
+ * 设置右边菜单区域
+ */
+ public void addMenuView(View menuView) {
+ //菜单区域View
+ menuView.setTag("menuView");
+
+ View mv = findViewWithTag("menuView");
+ if (mv != null) {
+ this.removeView(mv);
+ }
+ LayoutParams layoutParams = new LayoutParams(mRightCanSlide, ViewGroup.LayoutParams.MATCH_PARENT);
+ this.addView(menuView, layoutParams);
+ }
+
+ /**
+ * 设置Viewpager
+ */
+ public void setViewPager(ViewPager viewPager) {
+ mViewPager = viewPager;
+ }
+
+ /**
+ * 设置RecyclerView
+ */
+ public void setRecyclerView(RecyclerView recyclerView) {
+ mRecyclerView = recyclerView;
+ }
+
+ /** 设置CardView */
+ public void setCardView(CardView cardView) {
+ mCardView = cardView;
+ }
+
+ /*
+ ********************************** 方法 ********************************************
+ */
+ /**
+ * 拦截触摸事件
+ * 主要处理了左滑移动功能以及滑动冲突问题
+ * 为了防止垂直方向的同向冲突,那么需要将外层的RecyclerView传入左滑容器,在这个容器中会处理滑动冲突
+ */
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ int actionMasked = ev.getActionMasked();
+ Log.e(TAG, "onInterceptTouchEvent: actionMasked = " + actionMasked);
+ switch (actionMasked) {
+ case MotionEvent.ACTION_DOWN:
+ mInitX = ev.getRawX() + getScrollX();
+ mInitY = ev.getRawY();
+ clearAnim();
+
+ if (mViewPager != null) {
+ mViewPager.requestDisallowInterceptTouchEvent(true);
+ }
+
+ if (mCardView != null) {
+ mCardView.requestDisallowInterceptTouchEvent(true);
+ }
+
+ break;
+ case MotionEvent.ACTION_MOVE:
+ if (mInitX - ev.getRawX() < 0) {
+ // 让父级容器拦截
+ if (mRecyclerView != null && isReCompute) {
+ mRecyclerView.requestDisallowInterceptTouchEvent(false);
+ isReCompute = false;
+ }
+
+ // 阻止ViewPager拦截事件
+ if (mViewPager != null) {
+ mViewPager.requestDisallowInterceptTouchEvent(true);
+ }
+ return false;
+ }
+
+ // y轴方向上达到滑动最小距离, x 轴未达到
+ if (Math.abs(ev.getRawY() - mInitY) >= mTouchSlop
+ && Math.abs(ev.getRawY() - mInitY) > Math.abs(mInitX - ev.getRawX() - getScrollX())) {
+
+ // 让父级容器拦截
+ if (mRecyclerView != null && isReCompute) {
+ mRecyclerView.requestDisallowInterceptTouchEvent(false);
+ isReCompute = false;
+ }
+ return false;
+ }
+
+ // x轴方向达到了最小滑动距离,y轴未达到
+ if (Math.abs(mInitX - ev.getRawX() - getScrollX()) >= mTouchSlop
+ && Math.abs(ev.getRawY() - mInitY) <= Math.abs(mInitX - ev.getRawX() - getScrollX())) {
+
+ // 阻止父级容器拦截
+ if (mRecyclerView != null && isReCompute) {
+ mRecyclerView.requestDisallowInterceptTouchEvent(true);
+ isReCompute = false;
+ }
+ return true;
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL:
+ if (mRecyclerView != null) {
+ mRecyclerView.requestDisallowInterceptTouchEvent(false);
+ isReCompute = true;
+ }
+ break;
+ default:
+ break;
+ }
+ return super.onInterceptTouchEvent(ev);
+ }
+
+ /**
+ * 处理触摸事件
+ * 主要处理了左滑移动功能以及滑动冲突问题
+ * 需要注意何时处理左滑,何时不处理
+ */
+ @SuppressLint("ClickableViewAccessibility")
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ int actionMasked = ev.getActionMasked();
+ switch (actionMasked) {
+ case MotionEvent.ACTION_DOWN:
+ mInitX = ev.getRawX() + getScrollX();
+ mInitY = ev.getRawY();
+ clearAnim();
+
+ if (mViewPager != null) {
+ mViewPager.requestDisallowInterceptTouchEvent(true);
+ }
+
+ if (mCardView != null) {
+ mCardView.requestDisallowInterceptTouchEvent(true);
+ }
+
+ break;
+ case MotionEvent.ACTION_MOVE:
+ if (mInitX - ev.getRawX() < 0) {
+
+ // 让父级容器拦截
+ if (mRecyclerView != null && isReCompute) {
+ mRecyclerView.requestDisallowInterceptTouchEvent(false);
+ isReCompute = false;
+ }
+
+ // 阻止ViewPager拦截事件
+ if (mViewPager != null) {
+ mViewPager.requestDisallowInterceptTouchEvent(true);
+ isReCompute = false;
+ }
+ }
+
+ // y轴方向上达到滑动最小距离, x 轴未达到
+ if (Math.abs(ev.getRawY() - mInitY) >= mTouchSlop
+ && Math.abs(ev.getRawY() - mInitY) > Math.abs(mInitX - ev.getRawX() - getScrollX())) {
+
+ // 让父级容器拦截
+ if (mRecyclerView != null && isReCompute) {
+ mRecyclerView.requestDisallowInterceptTouchEvent(false);
+ isReCompute = false;
+ }
+ }
+
+ // x轴方向达到了最小滑动距离,y轴未达到
+ if (Math.abs(mInitX - ev.getRawX() - getScrollX()) >= mTouchSlop
+ && Math.abs(ev.getRawY() - mInitY) <= Math.abs(mInitX - ev.getRawX() - getScrollX())) {
+
+ // 阻止父级容器拦截
+ if (mRecyclerView != null && isReCompute) {
+ mRecyclerView.requestDisallowInterceptTouchEvent(true);
+ isReCompute = false;
+ }
+ }
+
+ // 如果手指移动距离超过最小距离
+ float translationX = mInitX - ev.getRawX();
+
+ // 如果滑动距离已经大于右边可伸缩的距离后, 应该重新设置initx
+ if (translationX > mRightCanSlide) {
+ mInitX = ev.getRawX() + mRightCanSlide;
+
+ }
+
+ // 如果互动距离小于0,那么重新设置初始位置initx
+ if (translationX < 0) {
+ mInitX = ev.getRawX();
+ }
+
+ translationX = translationX > mRightCanSlide ? mRightCanSlide : translationX;
+ translationX = translationX < 0 ? 0 : translationX;
+
+ // 向左滑动
+ if (translationX <= mRightCanSlide && translationX >= 0) {
+
+ scrollTo((int) translationX, 0);
+
+ return true;
+ }
+
+ break;
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL:
+
+ if (mRecyclerView != null) {
+ mRecyclerView.requestDisallowInterceptTouchEvent(false);
+ isReCompute = true;
+ }
+
+ upAnim();
+
+ return true;
+
+ default:
+ break;
+ }
+ return true;
+ }
+
+ /**
+ * 清除动画
+ */
+ private void clearAnim() {
+ if (mValueAnimator == null) {
+ return;
+ }
+
+ mValueAnimator.end();
+ mValueAnimator.cancel();
+ mValueAnimator = null;
+ }
+
+ /**
+ * 手指抬起执行动画
+ */
+ private void upAnim() {
+ int scrollX = getScrollX();
+ if (scrollX == mRightCanSlide || scrollX == 0) {
+ if (mStatusChangeLister != null) {
+ mStatusChangeLister.onStatusChange(scrollX == mRightCanSlide);
+ }
+ return;
+ }
+
+ clearAnim();
+
+ // 如果显出一半松开手指,那么自动完全显示。否则完全隐藏
+ if (scrollX >= mRightCanSlide / 2) {
+ mValueAnimator = ValueAnimator.ofInt(scrollX, mRightCanSlide);
+ mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ int value = (int) animation.getAnimatedValue();
+ scrollTo(value, 0);
+ }
+ });
+
+ mValueAnimator.setDuration(mAnimDuring);
+ mValueAnimator.start();
+
+ if (mStatusChangeLister != null) {
+ mStatusChangeLister.onStatusChange(true);
+ }
+ }
+ else {
+ mValueAnimator = ValueAnimator.ofInt(scrollX, 0);
+ mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ int value = (int) animation.getAnimatedValue();
+ scrollTo(value, 0);
+ }
+ });
+
+ mValueAnimator.setDuration(mAnimDuring);
+ mValueAnimator.start();
+
+ if (mStatusChangeLister != null) {
+ mStatusChangeLister.onStatusChange(false);
+ }
+ }
+ }
+
+ /**
+ * 重置--菜单展开/菜单收起 状态
+ * 菜单展开或者收起都会调用这个方法
+ */
+ public void resetDelStatus() {
+ int scrollX = getScrollX();
+ if (scrollX == 0) {
+ return;
+ }
+ clearAnim();
+
+ mValueAnimator = ValueAnimator.ofInt(scrollX, 0);
+ mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ int value = (int) animation.getAnimatedValue();
+ scrollTo(value, 0);
+ }
+ });
+
+ mValueAnimator.setDuration(mAnimDuring);
+ mValueAnimator.start();
+ }
+
+ /*
+ ********************************** 自定义接口 ********************************************
+ */
+ /**
+ * 删除按钮状态变化监听
+ */
+ //设置状态监听
+ public void setStatusChangeLister(OnDelViewStatusChangeLister statusChangeLister) {
+ mStatusChangeLister = statusChangeLister;
+ }
+
+ /**
+ * 自定义接口
+ * 删除按钮状态变化监听
+ * */
+ public interface OnDelViewStatusChangeLister {
+ /**
+ * 状态变化监听
+ * @param show 是否正在显示
+ */
+ void onStatusChange(boolean show);
+ }
+}
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/CustomLayout/PriceBoard.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/CustomLayout/PriceBoard.java
new file mode 100644
index 0000000..91a77df
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/CustomLayout/PriceBoard.java
@@ -0,0 +1,182 @@
+package com.example.orangesale_02.CustomLayout;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 通过代码创建的布局(如View,LinearLayout)等实现ListView效果
+ * 调用
+ * PriceBoard priceBoard = new PriceBoard(context,null);
+ * priceData = new PriceData();
+ * priceData.setName("现货白银");
+ * priceData.setEnCode("Ag");
+ * priceData.setPrice(4006);
+ * priceBoard.add(priceData);
+ * priceData = new PriceData();
+ * priceData.setName("现货铜");
+ * priceData.setEnCode("Cu");
+ * priceData.setPrice(43895);
+ * priceBoard.add(priceData);
+ * priceData = new PriceData();
+ * priceData.setName("现货镍");
+ * priceData.setEnCode("Ni");
+ * priceData.setPrice(43895);
+ * priceBoard.add(priceData);
+ * addView(priceBoard);
+ */
+
+public class PriceBoard extends LinearLayout {
+ private ListView listView;
+ private List items;
+ private LinearLayout.LayoutParams params;
+
+ public PriceBoard(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ items = new ArrayList();
+ this.setOrientation(HORIZONTAL);
+ params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
+ listView = new ListView(context);
+ listView.setLayoutParams(params);
+ PriceBoardAdapter priceBoardAdapter = new PriceBoardAdapter(context);
+ listView.setAdapter(priceBoardAdapter);
+ addView(listView, params);
+ }
+
+ public static class PriceData {
+ private String name;
+ private String encode;
+ private int price;
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name){
+ this.name = name;
+ }
+
+ public String getEnCode() {
+ return encode;
+ }
+ public void setEnCode(String getEnCode){
+ this.encode = encode;
+ }
+
+ public int getPrice() {
+ return price;
+ }
+ public void setPrice(int price){
+ this.price = price;
+ }
+ }
+
+ public void add(PriceData data) {
+ PriceBoardItem item = new PriceBoardItem(this.getContext(), null);
+ item.setItem(data);
+ items.add(item);
+ params.setMargins(10, 0, 0, 2);
+// item.setLayoutParams(params);
+ }
+
+ public PriceBoardItem getItemView(int index) {
+ return (PriceBoardItem) items.get(index);
+ }
+
+ private class PriceBoardItem extends LinearLayout {
+ private TextView nameView;
+ private TextView enCodeView;
+ private TextView priceView;
+ private PriceData priceData;
+
+ public PriceBoardItem(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ this.setOrientation(HORIZONTAL);
+ nameView = new TextView(context);
+ nameView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 38);
+ enCodeView = new TextView(context);
+ enCodeView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 28);
+ priceView = new TextView(context);
+ priceView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 48);
+ priceView.setGravity(Gravity.CENTER);
+ setLayout();
+ }
+
+ public TextView getNameView() {
+ return nameView;
+ }
+
+ public TextView getEnCodeView() {
+ return enCodeView;
+ }
+
+ public TextView getPriceView() {
+ return priceView;
+ }
+
+ public PriceData getPriceData() {
+ return priceData;
+ }
+
+ private void setLayout() {
+ LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1);
+ LinearLayout linearLayout = new LinearLayout(getContext());
+ linearLayout.setOrientation(VERTICAL);
+ linearLayout.addView(nameView, p);
+ linearLayout.addView(enCodeView, p);
+ addView(linearLayout, p);
+
+ p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT, 1);
+ linearLayout = new LinearLayout(getContext());
+ linearLayout.setOrientation(VERTICAL);
+ linearLayout.addView(priceView, p);
+ addView(linearLayout, p);
+ }
+
+ public void setItem(PriceData data) {
+ priceData = data;
+ }
+ }
+
+ private class PriceBoardAdapter extends BaseAdapter {
+ private Context _context;
+
+ public PriceBoardAdapter(Context context) {
+ _context = context;
+ }
+
+ public int getCount() {
+ return items.size();
+ }
+
+ public Object getItem(int position) {
+ return position;
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ PriceBoardItem view = getItemView(position);
+ PriceData data = ((PriceBoardItem) items.get(position)).getPriceData();
+ view.getNameView().setText(data.getName());
+ view.getEnCodeView().setText(data.getEnCode());
+ view.getPriceView().setText(String.valueOf(data.getPrice()));
+ convertView = view;
+ return convertView;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/CustomLayout/TouchEventLayout.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/CustomLayout/TouchEventLayout.java
new file mode 100644
index 0000000..bd0849b
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/CustomLayout/TouchEventLayout.java
@@ -0,0 +1,72 @@
+package com.example.orangesale_02.CustomLayout;
+
+import android.content.Context;
+import android.graphics.Point;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.widget.LinearLayout;
+
+import androidx.annotation.Nullable;
+
+/**
+ * 左滑删除容器LeftSlideView 的父级 TouchEventLayout,监听父级的触摸事件
+ * */
+public class TouchEventLayout extends LinearLayout {
+
+ public static final String TAG = "TouchEventLayout";
+
+ /** 触摸监听 */
+ private OnTouchListener mOnTouchListener;
+
+ /** 坐标 */
+ private Point mPoint;
+
+ public TouchEventLayout(Context context) {
+ super(context);
+ }
+
+ public TouchEventLayout(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public TouchEventLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public void setOnTouchListener(OnTouchListener onTouchListener) {
+ mOnTouchListener = onTouchListener;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ int actionMasked = event.getActionMasked();
+ Log.e(TAG, "onTouchEvent: actionMasked = " + actionMasked);
+ return super.onTouchEvent(event);
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ int actionMasked = ev.getActionMasked();
+ switch (actionMasked) {
+ case MotionEvent.ACTION_DOWN:
+ if (mOnTouchListener != null) {
+ mPoint = new Point((int)ev.getRawX(), (int)ev.getRawY());
+ mOnTouchListener.doTouch(mPoint);
+ }
+ break;
+ default:
+ break;
+ }
+ return super.onInterceptTouchEvent(ev);
+ }
+
+ /**
+ * 触摸监听
+ */
+ public interface OnTouchListener {
+
+ /** 触摸处理 */
+ void doTouch(Point point);
+ }
+}
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/activity/IndexActivity.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/activity/IndexActivity.java
new file mode 100644
index 0000000..50d170c
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/activity/IndexActivity.java
@@ -0,0 +1,205 @@
+package com.example.orangesale_02.activity;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.fragment.app.Fragment;
+import androidx.viewpager.widget.ViewPager;
+
+import android.graphics.Color;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.CompoundButton;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.example.orangesale_02.R;
+import com.example.orangesale_02.adapter.BottomBar_fragmentAdapter;
+import com.example.orangesale_02.fragment.BottomBar_cart;
+import com.example.orangesale_02.fragment.BottomBar_product;
+import com.example.orangesale_02.fragment.BottomBar_profile;
+import com.example.orangesale_02.fragment.BottomBar_shouye;
+import com.google.android.material.bottomnavigation.BottomNavigationView;
+import com.google.android.material.navigation.NavigationBarView;
+import com.google.android.material.navigation.NavigationView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class IndexActivity extends AppCompatActivity implements
+ ViewPager.OnPageChangeListener{
+
+ private BottomNavigationView bv_bottomNavigation;
+
+// private TextView txt_topbar;
+// private RadioGroup rg_tab_bar;
+// private RadioButton rb_channel;
+// private RadioButton rb_message;
+// private RadioButton rb_better;
+// private RadioButton rb_setting;
+
+ private ViewPager vpager;
+ private BottomBar_fragmentAdapter mAdapter;
+ public static final int PAGE_ONE = 0;
+ public static final int PAGE_TWO = 1;
+ public static final int PAGE_THREE = 2;
+ public static final int PAGE_FOUR = 3;
+ private List list;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_index);
+
+ bindViews();
+
+ /***
+ * ViewPager与BottomNavigationView的联动--点击
+ * ***/
+ bv_bottomNavigation.setOnItemSelectedListener(
+ new NavigationBarView.OnItemSelectedListener() {
+ @Override
+ public boolean onNavigationItemSelected(@NonNull MenuItem item) {
+ switch (item.getItemId()){
+ case R.id.menu_shouye:
+ //ViewPager 跳转到对应fragment
+ vpager.setCurrentItem(PAGE_ONE);
+ break;
+ case R.id.menu_product:
+ vpager.setCurrentItem(PAGE_TWO);
+ break;
+ case R.id.menu_cart:
+ vpager.setCurrentItem(PAGE_THREE);
+ break;
+ case R.id.menu_profile:
+ vpager.setCurrentItem(PAGE_FOUR);
+ break;
+ }
+ return true;
+ //这里返回true,表示事件已经被处理。如果返回false,为了达到条目选中效果,还需要下面的代码
+ // item.setChecked(true); 不论点击了哪一个,都手动设置为选中状态true(该控件并没有默认实现)
+ // 。如果不设置,只有第一个menu展示的时候是选中状态,其他的即便被点击选中了,图标和文字也不会做任何更改
+ }
+ });
+ //默认选中底部导航栏中的第一个
+ bv_bottomNavigation.getMenu().getItem(0).setChecked(true);
+ }
+
+ private void bindViews() {
+// txt_topbar = (TextView) findViewById(R.id.txt_topbar);
+// rg_tab_bar = (RadioGroup) findViewById(R.id.rg_tab_bar);
+// rb_channel = (RadioButton) findViewById(R.id.rb_channel);
+// rb_message = (RadioButton) findViewById(R.id.rb_message);
+// rb_better = (RadioButton) findViewById(R.id.rb_better);
+// rb_setting = (RadioButton) findViewById(R.id.rb_setting);
+// rg_tab_bar.setOnCheckedChangeListener(this);
+ bv_bottomNavigation = (BottomNavigationView) findViewById(R.id.bv_bottomNavigation);
+ vpager = (ViewPager) findViewById(R.id.vpager);
+
+ //把fragment添加到list
+ list = new ArrayList<>();
+ list.add(new BottomBar_shouye());
+ list.add(new BottomBar_product());
+ list.add(new BottomBar_cart());
+ list.add(new BottomBar_profile());
+ mAdapter = new BottomBar_fragmentAdapter(getSupportFragmentManager(),list);
+
+ vpager.setAdapter(mAdapter);
+ vpager.setCurrentItem(PAGE_ONE);
+ vpager.addOnPageChangeListener(this);
+ vpager.setOffscreenPageLimit(4); //限制只有4个view可以左右滑动
+// rb_channel.setChecked(true);
+// rb_channel.setBackgroundColor(Color.RED);//被选中背景色就为红色
+ }
+
+// @Override
+// public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
+// switch (checkedId) {
+// case R.id.rb_channel:
+// vpager.setCurrentItem(PAGE_ONE);
+//// txt_topbar.setText("首页");
+// break;
+// case R.id.rb_message:
+// vpager.setCurrentItem(PAGE_TWO);
+//// txt_topbar.setText("商品种类");
+// break;
+// case R.id.rb_better:
+// vpager.setCurrentItem(PAGE_THREE);
+//// txt_topbar.setText("");
+// break;
+// case R.id.rb_setting:
+// vpager.setCurrentItem(PAGE_FOUR);
+//// txt_topbar.setText("个人信息");
+// break;
+// }
+// }
+ //重写ViewPager页面切换的处理方法
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+ }
+
+ /***
+ * ViewPager与BottomNavigationView的联动--左右滑动
+ * ***/
+ @Override
+ public void onPageSelected(int position) {
+ switch (position){
+ case 0:
+ //ViewPager 左右滑动时,BottomNavigationView显示对应item
+ bv_bottomNavigation.getMenu().getItem(0).setChecked(true);
+// rb_channel.setBackgroundColor(Color.RED);
+// rb_message.setBackgroundColor(Color.WHITE);
+// rb_better.setBackgroundColor(Color.WHITE);
+// rb_setting.setBackgroundColor(Color.WHITE);
+ break;
+ case 1:
+ bv_bottomNavigation.getMenu().getItem(1).setChecked(true);
+// rb_channel.setBackgroundColor(Color.WHITE);
+// rb_message.setBackgroundColor(Color.RED);
+// rb_better.setBackgroundColor(Color.WHITE);
+// rb_setting.setBackgroundColor(Color.WHITE);
+ break;
+ case 2:
+ bv_bottomNavigation.getMenu().getItem(2).setChecked(true);
+// rb_channel.setBackgroundColor(Color.WHITE);
+// rb_message.setBackgroundColor(Color.WHITE);
+// rb_better.setBackgroundColor(Color.RED);
+// rb_setting.setBackgroundColor(Color.WHITE);
+ break;
+ case 3:
+ bv_bottomNavigation.getMenu().getItem(3).setChecked(true);
+// rb_channel.setBackgroundColor(Color.WHITE);
+// rb_message.setBackgroundColor(Color.WHITE);
+// rb_better.setBackgroundColor(Color.WHITE);
+// rb_setting.setBackgroundColor(Color.RED);
+ break;
+ }
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ //state的状态有三个,0表示什么都没做,1正在滑动,2滑动完毕
+ if (state == 2) {
+ switch (vpager.getCurrentItem()) {
+// case PAGE_ONE:
+//// rb_channel.setChecked(true);
+// break;
+// case PAGE_TWO:
+//// rb_message.setChecked(true);
+// break;
+// case PAGE_THREE:
+//// rb_better.setChecked(true);
+// break;
+// case PAGE_FOUR:
+//// rb_setting.setChecked(true);
+// break;
+ }
+ }
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/activity/MainActivity.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/activity/MainActivity.java
new file mode 100644
index 0000000..70a21f5
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/activity/MainActivity.java
@@ -0,0 +1,113 @@
+package com.example.orangesale_02.activity;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.Intent;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import com.example.orangesale_02.R;
+import com.example.orangesale_02.database.OrangeDatabase;
+
+public class MainActivity extends Activity implements View.OnClickListener{
+ private Button registerButton, loginButton;
+ private EditText usernameText, paswdEdit;
+ public boolean loginIn;
+ public static MainActivity instance = null;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ init();
+
+ OrangeDatabase orangeDatabase = new OrangeDatabase(MainActivity.this);
+ orangeDatabase.query(orangeDatabase, "orange_user"); //查询数据库
+
+ instance = this;
+// SQLiteDatabase sqLiteDatabase = orangeDatabase.getWritableDatabase();
+// Cursor c = sqLiteDatabase.query("orange_user", null,
+// null, null,null,
+// null,null);//游标接口,相当于结果集ResultSet
+//
+// Log.i("query result: ", String.valueOf(orangeDatabase.list.size()));
+// Log.i("query result: ", String.valueOf(orangeDatabase.list.get(0).getUsername()));
+ }
+ //界面组件初始化
+ private void init(){
+ usernameText = findViewById(R.id.username);
+ paswdEdit = findViewById(R.id.password);
+ loginButton = findViewById(R.id.login);
+ loginButton.setOnClickListener(this);
+ registerButton = (Button)findViewById(R.id.register);
+ registerButton.setOnClickListener(this);
+
+ }
+ //登录验证
+ private boolean validateLogin(){
+ String username = usernameText.getText().toString();
+ String password = paswdEdit.getText().toString();
+ OrangeDatabase orangeDatabase = new OrangeDatabase(MainActivity.this);
+ SQLiteDatabase sqLiteDatabase = orangeDatabase.getReadableDatabase();
+ Cursor cursor = sqLiteDatabase.rawQuery("select * from orange_user where " +
+ "username = ? and password = ?", new String[]{ username, password});
+ if (cursor.getCount() > 0 ){
+ return true;
+ }
+ return false;
+ }
+
+ @SuppressLint("Range")
+ @Override
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.register:
+ Intent intent = new Intent(this, RegisterActivity.class);
+ startActivity(intent);
+// loginIn = false;
+// usernameText.setText("XXXX");
+// Intent intent = new Intent(MainActivity.this, UserActivity.class);
+// Bundle bundle1 = new Bundle();
+// OrangeDatabase orangeDatabase1 = new OrangeDatabase(MainActivity.this);
+// bundle1.putString("username", usernameText.getText().toString());
+//// bundle1 = orangeDatabase1.queryUserInfo(
+//// orangeDatabase1.getReadableDatabase(), bundle1);
+// intent.putExtras(bundle1);
+// startActivity(intent);
+ break;
+ case R.id.login:
+ //注册时,引入了数据库,登录可以通过数据库进行验证,验证通过跳转到首页,不通过进行提示
+ if (validateLogin()){
+ Intent intent1 = new Intent(MainActivity.this, IndexActivity.class);
+ Bundle bundle = new Bundle();
+ OrangeDatabase orangeDatabase = new OrangeDatabase(MainActivity.this);
+ loginIn = true;
+ //传送用户信息到首页的"个人"
+ bundle.putString("username", usernameText.getText().toString());
+
+ bundle = orangeDatabase.queryUserInfo(
+ orangeDatabase.getReadableDatabase(), bundle);
+ intent1.putExtras(bundle);
+ startActivity(intent1);
+ }else{
+ Toast.makeText(MainActivity.this, "账号或者密码错误",
+ Toast.LENGTH_SHORT).show();
+ OrangeDatabase orangeDatabase = new OrangeDatabase(MainActivity.this);
+// orangeDatabase.delete(orangeDatabase, "orange_user", 2);//删除数据
+// orangeDatabase.insert(orangeDatabase,"orange_user", "mike",
+// "1234", "男", "广东省深圳市福田区");//增加数据
+// orangeDatabase.update(orangeDatabase, "orange_user", 1, "jane",
+// "6666", "男", "广东省,深圳市,福田区"); //更新数据
+ orangeDatabase.query(orangeDatabase, "orange_user"); //查询数据库
+ }
+ break;
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/activity/RegisterActivity.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/activity/RegisterActivity.java
new file mode 100644
index 0000000..f1be7eb
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/activity/RegisterActivity.java
@@ -0,0 +1,186 @@
+package com.example.orangesale_02.activity;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.database.sqlite.SQLiteDatabase;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.example.orangesale_02.R;
+import com.example.orangesale_02.database.OrangeDatabase;
+import com.wheelpicker.AdministrativeMap;
+import com.wheelpicker.AdministrativeUtil;
+import com.wheelpicker.DataPicker;
+import com.wheelpicker.OnCascadeWheelListener;
+import com.wheelpicker.OnMultiDataPickListener;
+import com.wheelpicker.PickOption;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RegisterActivity extends AppCompatActivity implements View.OnClickListener,
+ RadioGroup.OnCheckedChangeListener{
+ private EditText usernameEdit, passwordEdit, surePasswordEdit;
+ private TextView cityText;
+ private Button regButton;
+ private RadioGroup sexGroup;
+ private String sexStr = "男";
+ private String cityStr = "";
+ private AdministrativeMap mAdministrativeMap;
+ private List mCascadeInitIndex = new ArrayList();
+ private Context mContext;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_register);
+ init();
+ }
+
+ //界面组件初始化
+ private void init(){
+ cityText = findViewById(R.id.reg_province);
+ cityText.setOnClickListener(this);
+ usernameEdit = findViewById(R.id.reg_username);
+ passwordEdit = findViewById(R.id.reg_password);
+ surePasswordEdit = findViewById(R.id.reg_sure_password);
+ regButton = findViewById(R.id.reg_register);
+ regButton.setOnClickListener(this);
+ sexGroup = findViewById(R.id.sex);
+ sexGroup.setOnCheckedChangeListener(this);
+
+ mContext = this;//城市选择(级联操作)
+// //设置OnCascadeWheelListener即可满足级联
+// findViewById(R.id.reg_province).setOnClickListener(new View.OnClickListener() {
+// @Override
+// public void onClick(View view) {
+// pickCity(AdministrativeUtil.PROVINCE_CITY_AREA, mCascadeInitIndex);
+// }
+// });
+ }
+ //城市选择方法
+ private void pickCity(int mode, final List initIndex) {
+ if (mAdministrativeMap == null) {
+ mAdministrativeMap = AdministrativeUtil.loadCity(RegisterActivity.this);
+ }
+ PickOption option = getPickDefaultOptionBuilder(mContext)
+ .setMiddleTitleText("请选择城市")
+ .setFlingAnimFactor(0.4f)
+ .setVisibleItemCount(7)
+ .setItemTextSize(mContext.getResources()
+ .getDimensionPixelSize(com.wheelpicker.R.dimen.font_24px))
+ .setItemLineColor(0xFF558800)
+ .build();
+
+ DataPicker.pickData(mContext, initIndex,
+ AdministrativeUtil.getPickData(mAdministrativeMap, initIndex, mode), option,
+ new OnMultiDataPickListener() {
+ @Override
+ public void onDataPicked(List indexArr, List val, List data) {
+// String s = indexArr.toString() + ":" + val.toString();
+// Toast.makeText(RegisterActivity.this, s, Toast.LENGTH_SHORT).show();
+ cityStr = val.get(0).toString()+ "," +val.get(1).toString()
+ + "," +val.get(2).toString();
+ cityText.setText(cityStr);
+ initIndex.clear();
+ initIndex.addAll(indexArr);
+ }
+ }, new OnCascadeWheelListener>() {
+ @Override
+ public List> onCascade(int wheelIndex, List itemIndex) {
+ //级联数据
+ if (wheelIndex == 0) {
+ return mAdministrativeMap.provinces.get(itemIndex.get(0)).city;
+ } else if (wheelIndex == 1) {
+ return mAdministrativeMap.provinces.get(itemIndex.get(0)).city
+ .get(itemIndex.get(1)).areas;
+ }
+ return null;
+ }
+ });
+ }
+ //城市选择器默认设置
+ private PickOption.Builder getPickDefaultOptionBuilder(Context context) {
+ return PickOption.getPickDefaultOptionBuilder(context)
+ .setLeftTitleColor(0xFF1233DD)
+ .setRightTitleColor(0xFF1233DD)
+ .setMiddleTitleColor(0xFF333333)
+ .setTitleBackground(0XFFDDDDDD)
+ .setLeftTitleText("取消")
+ .setRightTitleText("确定");
+ }
+
+ @Override
+ public void onClick(View view) {
+ switch(view.getId()){
+ case R.id.reg_province://显示城市
+ pickCity(AdministrativeUtil.PROVINCE_CITY_AREA, mCascadeInitIndex);
+ break;
+ case R.id.reg_register:
+ validateRegister();//注册验证方法
+ break;
+ }
+ }
+ //注册验证
+ public void validateRegister(){
+ Intent intent = new Intent(RegisterActivity.this, UserActivity.class);
+ String username = usernameEdit.getText().toString();
+ String password = passwordEdit.getText().toString();
+ String surePassword = surePasswordEdit.getText().toString();
+ String city = cityText.getText().toString();
+ //判断两次密码是否一致
+ if (password.equals(surePassword)){
+ if (!username.equals("") || !password.equals("")){
+ if (!city.equals("")){
+ Bundle bundle = new Bundle();
+ //传送用户信息到个人主页
+ bundle.putString("username", username);
+ bundle.putString("password", password);
+ bundle.putString("sex", sexStr);
+ bundle.putString("city", city);
+ //使用安卓自带的SQlite数据库存储注册的信息
+ OrangeDatabase orangeDatabase = new OrangeDatabase(RegisterActivity.this);
+ SQLiteDatabase sqLiteDatabase = orangeDatabase.getWritableDatabase();
+ insertData(sqLiteDatabase, bundle);
+ intent.putExtras(bundle);
+ startActivity(intent); //跳转到个人主页
+ }else{
+ Toast.makeText(RegisterActivity.this,"请选择地址",
+ Toast.LENGTH_SHORT).show();
+ }
+ }else{
+ Toast.makeText(RegisterActivity.this, "账号或密码未填写",
+ Toast.LENGTH_SHORT).show();
+ }
+ }else{
+ Toast.makeText(RegisterActivity.this, "两次密码输入不一致",
+ Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ //插入数据的值
+ private void insertData(SQLiteDatabase sqLiteDatabase, Bundle bundle){
+ ContentValues contentValues = new ContentValues();
+ contentValues.put("username", bundle.getString("username"));
+ contentValues.put("password", bundle.getString("password"));
+ contentValues.put("sex", bundle.getString("sex"));
+ contentValues.put("city", bundle.getString("city"));
+ sqLiteDatabase.insert("orange_user", null, contentValues);
+ sqLiteDatabase.close();
+ }
+
+ //监听RadioGroup
+ @Override
+ public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
+ //根据用户选择来改变性别的值
+ sexStr = checkedId == R.id.reg_man ? "男" : "女";
+ }
+}
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/activity/UserActivity.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/activity/UserActivity.java
new file mode 100644
index 0000000..4761c62
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/activity/UserActivity.java
@@ -0,0 +1,66 @@
+package com.example.orangesale_02.activity;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.example.orangesale_02.R;
+import com.example.orangesale_02.database.OrangeDatabase;
+
+public class UserActivity extends Activity implements View.OnClickListener{
+
+ Button backMainButton,loginoutButton;
+ TextView user_username;
+ String username;
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_user);
+
+ //从注册活动页的textView 获取用户信息
+ Intent intent = this.getIntent();
+ Bundle bundle = intent.getExtras();
+ username = bundle.getString("username");
+ String sex = bundle.getString("sex");
+ String city = bundle.getString("city");
+
+ user_username = findViewById(R.id.user_username);
+ user_username.setText("用户名:"+username);
+ TextView user_sex = findViewById(R.id.user_sex);
+ user_sex.setText("性别:"+sex);
+ TextView user_city = findViewById(R.id.user_city);
+ user_city.setText("城市:"+city);
+
+ backMainButton = (Button)findViewById(R.id.backMain);
+ backMainButton.setOnClickListener(this);
+ loginoutButton = (Button)findViewById(R.id.loginout);
+ loginoutButton.setOnClickListener(this);
+
+ }
+
+ @Override
+ public void onClick(View view) {
+ switch (view.getId()){
+ case R.id.backMain:
+// startActivity(new Intent(this, IndexActivity.class));
+ Intent intent = new Intent(UserActivity.this, IndexActivity.class);
+ Bundle bundle1 = new Bundle();
+ OrangeDatabase orangeDatabase1 = new OrangeDatabase(UserActivity.this);
+ //传送用户信息到首页的"个人"
+ bundle1.putString("username", username);
+ bundle1 = orangeDatabase1.queryUserInfo(
+ orangeDatabase1.getReadableDatabase(), bundle1);
+ intent.putExtras(bundle1);
+ startActivity(intent);
+ break;
+ case R.id.loginout:
+ startActivity(new Intent(this, MainActivity.class));
+ break;
+ }
+ }
+}
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/adapter/BottomBar_fragmentAdapter.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/adapter/BottomBar_fragmentAdapter.java
new file mode 100644
index 0000000..805eb14
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/adapter/BottomBar_fragmentAdapter.java
@@ -0,0 +1,33 @@
+package com.example.orangesale_02.adapter;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentPagerAdapter;
+import java.util.List;
+
+public class BottomBar_fragmentAdapter extends FragmentPagerAdapter {
+
+ private List mlist;
+
+ //构造器
+ public BottomBar_fragmentAdapter(FragmentManager fragment,List list) {
+ super(fragment);
+ this.mlist = list;
+ }
+
+ //显示第几个页面
+ @NonNull
+ @Override
+ public Fragment getItem(int position) {
+ return mlist.get(position);
+ }
+
+ //一共有几个页面
+ @Override
+ public int getCount() {
+ return mlist.size();
+ }
+
+
+}
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/adapter/GoodCartAdapter.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/adapter/GoodCartAdapter.java
new file mode 100644
index 0000000..f8e58e0
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/adapter/GoodCartAdapter.java
@@ -0,0 +1,241 @@
+package com.example.orangesale_02.adapter;
+
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.graphics.Point;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.bumptech.glide.Glide;
+import com.example.orangesale_02.CustomLayout.LeftSlideView;
+import com.example.orangesale_02.R;
+import com.example.orangesale_02.bean.ChatBean;
+import com.example.orangesale_02.custominterface.GoodsCallback;
+import com.example.orangesale_02.custominterface.OnDeleteClickListener;
+import com.example.orangesale_02.custominterface.OnEditClickListener;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class GoodCartAdapter extends RecyclerView.Adapter{
+
+ private Context context;
+ List data = new ArrayList<>();
+ private OnEditClickListener mOnEditClickListener;
+ private OnDeleteClickListener mOnDeleteClickListener;
+ private GoodsCallback goodsCallback; //商品回调
+ ChatBean item;//从StoreCallback获取店铺数据
+
+ private LeftSlideView mLeftSlideView;
+ //为了防止垂直方向的同向冲突,那么需要将外层的RecyclerView传入左滑容器,在容器中会处理滑动冲突
+ private RecyclerView mRecyclerView;
+ View contentView;
+ View menuView;
+
+ //构造方法
+ public GoodCartAdapter(Context context, List data,
+ GoodsCallback goodsCallback, RecyclerView recyclerView){
+ this.context = context;
+ this.data = data;
+ this.goodsCallback = goodsCallback;
+ this.mRecyclerView = recyclerView;
+ }
+
+ //返回内部类MyViewHolder
+ @Override
+ public GoodViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+// View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cartitem_good, parent, false);
+// return new GoodViewHolder(view);
+
+ //左滑删除容器 LeftSlideView
+ final LeftSlideView leftSlideView = new LeftSlideView(context);
+ LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT
+ , ViewGroup.LayoutParams.WRAP_CONTENT);
+ leftSlideView.setLayoutParams(params);
+ contentView = LayoutInflater.from(context).inflate(R.layout.cartitem_good, null);
+ menuView = LayoutInflater.from(context).inflate(R.layout.cartitem_good_menuview, null);
+ leftSlideView.addContentView(contentView);
+ leftSlideView.addMenuView(menuView);
+ leftSlideView.setRecyclerView(mRecyclerView);
+
+ leftSlideView.setStatusChangeLister(new LeftSlideView.OnDelViewStatusChangeLister() {
+ @Override
+ public void onStatusChange(boolean show) {
+ if (show) {
+ // 如果编辑菜单在显示
+ mLeftSlideView = leftSlideView;
+ }
+ }
+ });
+ return new GoodViewHolder(leftSlideView);
+ }
+
+ //对每一项的TextView进行赋值,取出实体的某一属性进行显示,position为下标。
+ @Override
+ public void onBindViewHolder(GoodViewHolder holder, @SuppressLint("RecyclerView") final int position) {
+
+ final ChatBean.ChatItem good = data.get(position);
+
+ Glide.with(context).load(good.getGoodsImg()).into(holder.iv_goodsImage);
+ holder.tv_goodsName.setText(good.getGoodsname());
+ holder.tv_goodsDescription.setText("颜色:" + good.getColor()+" "+"尺寸:" + good.getSize());
+ holder.tv_goodsPrice.setText("¥" + good.getGoodsPrice());
+ holder.tv_goodsNum.setText(good.getGoodsNum()+ "");
+
+ //商品初始状态是否勾选
+ if(good.getGoodChecked()){
+ holder.iv_goodsSelect.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_checked));
+ }else {
+ holder.iv_goodsSelect.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_check));
+ }
+ //商品item中的点击事件
+ holder.iv_goodsSelect.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ good.setGoodChecked(!good.getGoodChecked());
+ notifyDataSetChanged();
+ controlStore(item); //该店铺如果所有商品都选中,则店铺自动选中
+ goodsCallback.calculationPrice();//计算商品价格
+ }
+ });
+ //给每个item->GoodsMin绑定点击事件,数量的改变
+ holder.iv_mine.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if(data.get(position).getGoodsNum() > 1) {
+ int count = data.get(position).getGoodsNum() - 1;
+ if (mOnEditClickListener != null) {
+ mOnEditClickListener.onEditClick(position, data.get(position).getProductId(), count);
+ }
+ data.get(position).setGoodsNum(count);
+ notifyDataSetChanged();
+ }
+ }
+ });
+ //给每个item->GoodsAdd绑定点击事件,数量的改变
+ holder.iv_goodsAdd.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ int count = data.get(position).getGoodsNum() + 1;
+ if(mOnEditClickListener != null){
+ mOnEditClickListener.onEditClick(position,data.get(position).getProductId(),count);
+ }
+ data.get(position).setGoodsNum(count);
+ notifyDataSetChanged();
+ }
+ });
+
+ contentView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+// Toast.makeText(context, "点击内容区域", Toast.LENGTH_SHORT).show();
+ }
+ });
+ //删除的点击事件
+ menuView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+// Toast.makeText(context, "点击删除按钮", Toast.LENGTH_SHORT).show();
+ if(good.getGoodChecked()){
+ goodsCallback.deleteCheckedGoods();//商品选中时
+ }else{
+ showDialog(view,position);//商品未选中时
+ }
+ }
+ });
+
+ }
+
+ //获得实体list的长度,即显示项的个数
+ @Override
+ public int getItemCount() {
+ return data == null?0:data.size();
+ }
+
+ static class GoodViewHolder extends RecyclerView.ViewHolder{
+ private TextView tv_goodsName,tv_goodsDescription,tv_goodsPrice,tv_goodsNum;
+ private ImageView iv_goodsImage,iv_mine,iv_goodsAdd,iv_goodsSelect;
+
+ //变量绑定layout
+ public GoodViewHolder(View itemView) {
+ super(itemView);
+ tv_goodsName = (TextView) itemView.findViewById(R.id.tv_goodsName);
+ tv_goodsDescription = (TextView) itemView.findViewById(R.id.tv_goodsDescription);
+ tv_goodsPrice = (TextView) itemView.findViewById(R.id.tv_goodsPrice);
+ tv_goodsNum = (TextView) itemView.findViewById(R.id.tv_goodsNum);
+ iv_goodsImage = (ImageView) itemView.findViewById(R.id.iv_goodsImage);
+ iv_goodsSelect = (ImageView) itemView.findViewById(R.id.iv_goodsSelect);
+ iv_mine = (ImageView) itemView.findViewById(R.id.iv_mine);
+ iv_goodsAdd = (ImageView) itemView.findViewById(R.id.iv_goodsAdd);
+ }
+ }
+
+ /*********************************自定义方法****************************************************/
+ /**
+ * 还原itemView
+ * @param point
+ */
+ public void restoreItemView(Point point) {
+ if (mLeftSlideView != null) {
+ int[] pos = new int[2];
+ mLeftSlideView.getLocationInWindow(pos);
+
+ int width = mLeftSlideView.getWidth();
+ int height = mLeftSlideView.getHeight();
+
+ // 触摸点在view的区域内,那么直接返回
+ if (point.x >= pos[0] && point.y >= pos[1]
+ && point.x <= pos[0] + width && point.y <= pos[1] + height) {
+ return;
+ }
+ mLeftSlideView.resetDelStatus();//重置
+ }
+ }
+
+ /**
+ * 若该店铺下所有商品都选中,则店铺自动选中
+ * 记录选中商品数量,遍历完成之后,判断选中总数量是否等于店铺拥有商品数量,相等则店铺自动选中,否则店铺不选中
+ */
+ public void controlStore(ChatBean item) {
+ int num = 0;
+ for (ChatBean.ChatItem bean : item.getgoodsList()) {
+ if (bean.getGoodChecked()) {
+ ++num;
+ }
+ }
+ if (num == item.getgoodsList().size()) {
+ //商品全选中,ShopCartAdapter需要设置店铺为选中状态
+ //通过回调接口 goodsCallback 向ShopCartAdapter 传递需要设置的店铺id和店铺状态设置值
+ goodsCallback.selectAllStore(item.getShopId(),true);
+ } else {
+ goodsCallback.selectAllStore(item.getShopId(),false);
+ }
+ }
+
+ //每个item删除的点击事件
+ private void showDialog(final View view, final int position){
+ //调用删除某个规格商品的接口
+ if(mOnDeleteClickListener != null){
+ mOnDeleteClickListener.onDeleteClick(
+ view,position,data.get(position).getProductId());//找到商品id
+ }
+ data.remove(position);
+ //刷新数据
+ notifyDataSetChanged();
+
+ if (data.size() == 0){
+ goodsCallback.deleteUncheckedGoods(item.getShopId());
+ }
+ }
+
+}
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/adapter/ProductLeftAdapter.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/adapter/ProductLeftAdapter.java
new file mode 100644
index 0000000..89f786b
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/adapter/ProductLeftAdapter.java
@@ -0,0 +1,99 @@
+package com.example.orangesale_02.adapter;
+
+import android.graphics.Color;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.example.orangesale_02.R;
+import com.example.orangesale_02.bean.ProductLeftBean;
+
+import java.util.List;
+
+public class ProductLeftAdapter extends BaseAdapter {
+
+ private List leftList;
+ private int rightclickItem = -1;
+ private int leftclickItem = -1;
+ public boolean isClickLeft = false;
+
+ //创建一个构造方法
+ public ProductLeftAdapter(List mList) {
+ this.leftList = mList;
+ }
+
+ @Override
+ public int getCount() {
+ return leftList.size();
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return leftList.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ Produce_leftViewHolder viewHolder = null;
+ if (convertView==null){
+ convertView = View.inflate(parent.getContext(), R.layout.productitem_left,null);
+
+ //创建viewHolder对象
+ viewHolder = new Produce_leftViewHolder();
+ viewHolder.tv_title = (TextView) convertView.findViewById(R.id.tv_title);
+ viewHolder.v_bg = (LinearLayout) convertView.findViewById(R.id.v_bg);
+
+ //让viewholder挂在convertview上面一起复用
+ convertView.setTag(viewHolder);
+ }else {
+ //当convertView不为空时,吧viewholder取出来
+ viewHolder = (Produce_leftViewHolder) convertView.getTag();
+ }
+
+ //获取对应条目的内容
+ ProductLeftBean leftBean = (ProductLeftBean) getItem(position);
+ //把对应条目的内容设置在控件上
+ viewHolder.tv_title.setText(leftBean.title);
+
+ //给左侧条目设置颜色
+ if (isClickLeft){
+ if (leftclickItem != position){
+ viewHolder.v_bg.setBackgroundColor(
+ parent.getContext().getResources().getColor(R.color.yellow));
+ }else{
+ viewHolder.v_bg.setBackgroundColor(Color.WHITE);
+ }
+ }else{
+ if (rightclickItem != position){
+ viewHolder.v_bg.setBackgroundColor(
+ parent.getContext().getResources().getColor(R.color.yellow));
+ }else{
+ viewHolder.v_bg.setBackgroundColor(Color.WHITE);
+ }
+ }
+ return convertView;
+ }
+
+ //创建一个viewholder,用来复用对象
+ class Produce_leftViewHolder{
+ TextView tv_title;
+ LinearLayout v_bg;
+ }
+
+ //左侧条目点击事件,设置UI
+ public void setCurrentSelect_Left(int position){
+ this.leftclickItem = position;
+ }
+
+ //右侧滚动或点击,设置对应的左侧条目UI
+ public void setCurrentSelect_Right(int currentLeftItem){
+ this.rightclickItem = currentLeftItem;
+ }
+}
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/adapter/ProductRightAdapter.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/adapter/ProductRightAdapter.java
new file mode 100644
index 0000000..2a30273
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/adapter/ProductRightAdapter.java
@@ -0,0 +1,96 @@
+package com.example.orangesale_02.adapter;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.example.orangesale_02.R;
+import com.example.orangesale_02.bean.ProductLeftBean;
+import com.example.orangesale_02.bean.ProductRightBean;
+
+import java.util.List;
+import java.util.Random;
+
+import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter;
+
+public class ProductRightAdapter extends BaseAdapter implements StickyListHeadersAdapter {
+ private List mLeft;
+ private List mRight;
+ private Context context;
+
+ public ProductRightAdapter(List mLeft, List mRight,
+ Context context) {
+ this.mLeft = mLeft;
+ this.mRight = mRight;
+ this.context = context;
+ }
+ @Override
+ public View getHeaderView(int position, View convertView, ViewGroup parent) {
+ TextView tv = new TextView(context);
+ tv.setBackgroundColor(Color.WHITE);
+ tv.setTextColor(Color.BLACK);
+ tv.setTextSize(15);
+ tv.setText(mRight.get(position).type);
+ return tv;
+ }
+
+ @Override
+ public long getHeaderId(int position) {
+ return mRight.get(position).typeId;
+ }
+
+ @Override
+ public int getCount() {
+ return mRight.size();
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return mRight.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ Produce_rightViewHolder viewHolder = null;
+ if (convertView==null){
+ convertView = View.inflate(context, R.layout.productitem_right,null);
+ viewHolder = new Produce_rightViewHolder();
+ viewHolder.tv_foodname = (TextView) convertView.findViewById(R.id.tv_foodname);
+ viewHolder.tv_foodprice = (TextView) convertView.findViewById(R.id.tv_foodprice);
+ viewHolder.tv_foodsale = (TextView) convertView.findViewById(R.id.tv_foodsale);
+ viewHolder.iv_img = (ImageView) convertView.findViewById(R.id.iv_img);
+
+ convertView.setTag(viewHolder);
+ }else {
+ viewHolder = (Produce_rightViewHolder) convertView.getTag();
+ }
+ ProductRightBean rightBean = mRight.get(position);
+ viewHolder.tv_foodname.setText(rightBean.foodname);
+ viewHolder.iv_img.setImageResource(rightBean.img);
+
+ //使用Random获取随机数
+ Random random = new Random();
+ int i = random.nextInt(100);
+ viewHolder.tv_foodsale.setText("月销量"+i+"份");
+ int j = random.nextInt(50);
+ viewHolder.tv_foodprice.setText("$"+j);
+ return convertView;
+ }
+
+ //创建一个viewholder,用来复用对象
+ class Produce_rightViewHolder{
+ TextView tv_foodname;
+ TextView tv_foodprice;
+ TextView tv_foodsale;
+ ImageView iv_img;
+ }
+}
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/adapter/ShopCartAdapter.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/adapter/ShopCartAdapter.java
new file mode 100644
index 0000000..a4c585f
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/adapter/ShopCartAdapter.java
@@ -0,0 +1,280 @@
+package com.example.orangesale_02.adapter;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.graphics.Point;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.example.orangesale_02.CustomLayout.TouchEventLayout;
+import com.example.orangesale_02.CustomLayout.DPIUtil;
+import com.example.orangesale_02.R;
+import com.example.orangesale_02.bean.ChatBean;
+import com.example.orangesale_02.custominterface.GoodsCallback;
+import com.example.orangesale_02.custominterface.StoreCallback;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ShopCartAdapter extends RecyclerView.Adapter
+ implements GoodsCallback{
+ private Context context;
+ private GoodCartAdapter goodsAdapter;
+ private List shopslist = new ArrayList<>();//店铺列表
+ public List shopIdList = new ArrayList<>();//全选列表
+ private StoreCallback storesCallback; //商铺回调
+ public double totalPrice = 0.00;//商品总价
+ public int totalCount = 0;//商品总数量
+
+ //构造方法
+ public ShopCartAdapter(Context context, List shopslist, StoreCallback storesCallback){
+ this.context = context;
+ this.shopslist = shopslist;
+ this.storesCallback = storesCallback;
+ }
+
+ //返回我们的内部类MyViewHolder
+ @Override
+ public ShopViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ View view = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.cartitem_store, parent, false);
+
+ // 初始化转换工具
+ DPIUtil.setDensity(context.getResources().getDisplayMetrics().density);
+ // 左滑删除容器LeftSlideView 的父级 TouchEventLayout,监听父级的触摸事件
+ View root = view.findViewById(R.id.root);
+ if (root instanceof TouchEventLayout) {
+ TouchEventLayout ll = (TouchEventLayout) root;
+ ll.setOnTouchListener(new TouchEventLayout.OnTouchListener() {
+ @Override
+ public void doTouch(Point point) {
+ if (goodsAdapter != null) {
+ goodsAdapter.restoreItemView(point);//还原itemView
+ }
+ }
+ });
+ }
+ return new ShopViewHolder(view);
+ }
+
+ //对每一项的TextView进行赋值,取出实体的某一属性进行显示,position为下标。
+ @Override
+ public void onBindViewHolder(ShopViewHolder holder, @SuppressLint("RecyclerView") int position) {
+
+ ChatBean shop = shopslist.get(position);
+
+ //绑定商品适配器
+ holder.rv_goods.setLayoutManager(new LinearLayoutManager(context));
+ goodsAdapter = new GoodCartAdapter(context, shop.getgoodsList(),
+ this,holder.rv_goods);
+ holder.rv_goods.setAdapter(goodsAdapter);
+
+ goodsAdapter.item = shop;//将shop传递给商品的item,用于判断商品是否已全选,是否选中店铺
+
+ //商店名数据填充
+ holder.tv_store_name.setText(shop.getShopName());
+
+ //店铺初始状态是否勾选
+ if(shop.getShopSelect()){
+ holder.iv_checked_store.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_checked));
+ }else {
+ holder.iv_checked_store.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_check));
+ }
+
+ //shop选中的点击事件
+ holder.iv_checked_store.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //当前商铺勾选状态取反
+ shop.setShopSelect(!shop.getShopSelect());
+ notifyDataSetChanged();
+
+ //全选事件--当一个一个选中店铺时,全选按钮为true
+ if (shop.getShopSelect()){
+ selectAllGoods(shop.getShopId(), true);//该商铺下所有商品勾选状态同商铺一样
+
+ //该店铺已被选中,但全选列表中没有该店铺id
+ if(!shopIdList.contains(shop.getShopId())){
+ shopIdList.add(shop.getShopId());//添加到店铺列表
+ }
+ }else{
+ selectAllGoods(shop.getShopId(), false);//该商铺下所有商品勾选状态同商铺一样
+ //该店铺未被选中,全选列表移除该店铺id
+ if(shopIdList.contains(shop.getShopId())){
+ shopIdList.remove((Integer) shop.getShopId());
+ }
+ }
+ controllAllChecked(); //传递全选按钮的状态到主页
+ }
+ });
+
+ }
+
+ //获得实体list的长度,即显示项的个数
+ @Override
+ public int getItemCount() {
+ return shopslist == null?0:shopslist.size();
+ }
+
+ class ShopViewHolder extends RecyclerView.ViewHolder{
+ private RecyclerView rv_goods;
+ private TextView tv_store_name;
+ private ImageView iv_checked_store;//店铺是否被选中
+
+ //变量绑定layout
+ public ShopViewHolder(View itemView) {
+ super(itemView);
+ rv_goods = itemView.findViewById(R.id.rv_goods);
+ tv_store_name = (TextView) itemView.findViewById(R.id.tv_store_name);
+ iv_checked_store = (ImageView) itemView.findViewById(R.id.iv_checked_store);
+ }
+ }
+
+ /****************************自定义方法*************************************************/
+ /**
+ * 传递全选按钮的状态到主页
+ */
+ public void controllAllChecked() {
+ if(shopIdList.size() == shopslist.size() && shopslist.size() != 0){
+ //全选
+ storesCallback.isSelectAll(true);
+ }else {
+ //不全选
+ storesCallback.isSelectAll(false);
+ }
+ calculationPrice();
+ }
+
+ /**
+ * shop点击事件--选中店铺,该店铺下所有商品选中
+ */
+ public void selectAllGoods(int shopId, boolean state) {
+ //根据店铺id选中该店铺下所有商品
+ for (ChatBean shop : shopslist) {
+ //店铺id等于传递过来的店铺id 则选中该店铺下所有商品
+ if (shop.getShopId() == shopId) {
+ for (ChatBean.ChatItem good : shop.getgoodsList()) {
+ good.setGoodChecked(state);
+ //刷新
+ notifyDataSetChanged();
+ }
+ }
+ }
+ }
+
+ /*************************** 回调 *******************************/
+ /**
+ * GoodsCallback 回调
+ * 商品价格
+ */
+ @Override
+ public void calculationPrice(){
+ //每次计算之前先置零
+ totalPrice = 0.00;
+ totalCount = 0;
+ //循环购物车中的店铺列表
+ for (int i = 0; i < shopslist.size(); i++) {
+ ChatBean shop = shopslist.get(i);
+ //循环店铺中的商品列表
+ for (int j = 0; j < shop.getgoodsList().size(); j++) {
+ ChatBean.ChatItem good = shop.getgoodsList().get(j);
+ //当有选中商品时计算数量和价格
+ if (good.getGoodChecked()) {
+ totalCount++;
+ totalPrice += good.getGoodsPrice() * good.getGoodsNum();
+ }
+ }
+ }
+ storesCallback.allPrice(totalPrice,totalCount);//通过StoreCallback 设置首页的总价格
+ }
+
+ /**
+ * GoodsCallback 回调
+ * 1.某店铺以下的所有商品被选中时,店铺被选中(GoodsCallback 控制店铺按钮的状态)
+ * 2.一个一个的选中商品,商品对应的店铺被选中,达成全选(传递全选按钮的状态)
+ */
+ @Override
+ public void selectAllStore(int shopId, boolean state) {
+ for (ChatBean shop : shopslist) {
+ if(shopId == shop.getShopId()){
+ //GoodsCallback 回调 -- 商品选中状态决定店铺选中状态
+ //遍历,在 shopslist 找到需要设置的店铺,设置为选中状态
+ shop.setShopSelect(state);
+ notifyDataSetChanged();
+
+ //StoreCallback 回调 -- 店铺选中状态决定全选按钮状态
+ //单击商品,记录选中店铺的shopid,添加到全选列表中
+ if (!shopIdList.contains(shop.getShopId()) && state) {
+ //如果列表中没有这个店铺Id且当前店铺为选中状态
+ shopIdList.add(shop.getShopId());
+ }else {
+ if(shopIdList.contains(shop.getShopId())){
+ //通过list.indexOf获取属性的在列表中的下标,不过强转Integer更简洁
+ shopIdList.remove((Integer) shop.getShopId());
+ }
+ }
+ }
+ }
+ controllAllChecked();//传递全选按钮的状态到主页
+ }
+
+ /** GoodsCallback 回调
+ * 商品选中时的删除事件
+ * **/
+ @Override
+ public void deleteCheckedGoods() {
+ //店铺列表
+ List storeList = new ArrayList<>();
+ for (int i = 0; i < shopslist.size(); i++) {
+ ChatBean store = shopslist.get(i);
+ if (store.getShopSelect()) {
+ //店铺如果选择则添加到此列表中
+ storeList.add(store);
+ }
+ //商品列表
+ List newgoodsList = new ArrayList<>();
+ List goodsList = store.getgoodsList();
+ //循环店铺中的商品列表
+ for (int j = 0; j < goodsList.size(); j++) {
+ ChatBean.ChatItem good = goodsList.get(j);
+ //当有选中商品时添加到此列表中
+ if (good.getGoodChecked()) {
+ newgoodsList.add(good);
+ }
+ }
+ //删除商品
+ goodsList.removeAll(newgoodsList);
+ }
+
+ shopslist.removeAll(storeList);//删除店铺
+ shopIdList.clear();//删除了选中商品,清空已选择的标识
+ controllAllChecked();////传递全选按钮的状态到主页
+ //刷新数据
+ notifyDataSetChanged();
+ }
+
+ /** GoodsCallback 回调
+ * 商品未选中时的删除事件
+ * **/
+ @Override
+ public void deleteUncheckedGoods(int shopId) {
+ List storeList = new ArrayList<>();
+ for (int i = 0; i < shopslist.size(); i++){
+ ChatBean shop = shopslist.get(i);
+ if (shopId == shop.getShopId()) {
+// Log.i("data - getShopId", String.valueOf(shopId));
+ storeList.add(shop);
+ }
+ }
+ shopslist.removeAll(storeList);//删除店铺
+ storesCallback.allPrice(totalPrice,totalCount);
+ notifyDataSetChanged();
+ }
+}
+
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/adapter/ShouyeGridBaseA.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/adapter/ShouyeGridBaseA.java
new file mode 100644
index 0000000..6c00601
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/adapter/ShouyeGridBaseA.java
@@ -0,0 +1,71 @@
+package com.example.orangesale_02.adapter;
+
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.example.orangesale_02.R;
+import com.example.orangesale_02.bean.ProductLeftBean;
+import com.example.orangesale_02.bean.ShouyeGridIcon;
+
+import org.w3c.dom.Text;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ShouyeGridBaseA extends BaseAdapter {
+
+ private List gridList;
+
+ //创建一个构造方法
+ public ShouyeGridBaseA(List mList) {
+ this.gridList = mList;
+ }
+
+ @Override
+ public int getCount() {
+ return gridList.size();
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return gridList.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ GridViewHolder viewHolder = null;
+
+ if (convertView==null){
+ convertView = View.inflate(parent.getContext(), R.layout.shouyeitem_grid_icon,null);
+ //创建viewHolder对象
+ viewHolder = new GridViewHolder();
+ viewHolder.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
+ viewHolder.txt_icon = (TextView) convertView.findViewById(R.id.txt_icon);
+
+ //让viewholder挂在convertview上面一起复用
+ convertView.setTag(viewHolder);
+ }else {
+ //当convertView不为空时,吧viewholder取出来
+ viewHolder = (GridViewHolder) convertView.getTag();
+ }
+ viewHolder.img_icon.setImageResource(gridList.get(position).getiId());
+ viewHolder.txt_icon.setText(gridList.get(position).getiName());
+
+ return convertView;
+ }
+
+ //创建一个viewholder,用来复用对象
+ class GridViewHolder{
+ ImageView img_icon;
+ TextView txt_icon;
+ }
+}
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/bean/ChatBean.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/bean/ChatBean.java
new file mode 100644
index 0000000..21a9031
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/bean/ChatBean.java
@@ -0,0 +1,167 @@
+package com.example.orangesale_02.bean;
+
+import java.util.List;
+
+//店铺类
+public class ChatBean {
+ private String shopName;//店铺名
+ private boolean shopChecked;
+ private int shopId;
+ private List goodsList;
+
+ public ChatBean(String shopname, int shopId,List goodsList) {
+ this.shopName = shopname;
+ this.shopId = shopId;
+ this.goodsList = goodsList;
+ }
+
+ public String getShopName() {
+ return shopName;
+ }
+ public void setShopName(String shopName) {
+ this.shopName = shopName;
+ }
+
+ public List getgoodsList() {
+ return goodsList;
+ }
+ public void setgoodsList(List goodsList) {
+ this.goodsList = goodsList;
+ }
+
+ public boolean getShopSelect(){
+ return shopChecked;
+ }
+ public void setShopSelect(boolean shopChecked) {
+ this.shopChecked = shopChecked;
+ }
+
+ public int getShopId() {
+ return shopId;
+ }
+ public void setShopId(int shopId) {
+ this.shopId = shopId;
+ }
+
+ //商品类
+ public static class ChatItem {
+
+ private String goodsname;//商品
+ private int goodsImg;
+ private int goodsPrice;
+ private int goodsNum;
+ private String defaultPic;
+ private boolean goodChecked;
+ private boolean shopChecked;
+ private int shopId;
+ private String color;
+ private String shopName;
+ private int productId;
+ private int index;
+ private String size;
+
+ public ChatItem(String goodsname, int goodsImg, String color,String size,
+ int goodsPrice,int goodsNum) {
+ this.goodsname = goodsname;
+ this.goodsImg = goodsImg;
+ this.color = color;
+ this.size = size;
+ this.goodsPrice = goodsPrice;
+ this.goodsNum = goodsNum;
+ }
+
+ public String getGoodsname() {
+ return goodsname;
+ }
+ public void setGoodsname(String goodsname) {
+ this.goodsname = goodsname;
+ }
+
+ public String getColor() {
+ return color;
+ }
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+ public String getSize() {
+ return size;
+ }
+ public void setSize(String size) {
+ this.size = size;
+ }
+
+ public int getGoodsPrice() {
+ return goodsPrice;
+ }
+ public void setGoodsPrice(int goodsPrice) {
+ this.goodsPrice = goodsPrice;
+ }
+
+ public int getGoodsNum() {
+ return goodsNum;
+ }
+ public void setGoodsNum(int count) {
+ this.goodsNum = count;
+ }
+
+ //本地图片
+ public int getGoodsImg() {return goodsImg;}
+ public void setGoodsImg(int goodsImg) {
+ this.goodsImg = goodsImg;
+ }
+
+ //网络图片
+// public String getDefaultPic() {
+// return defaultPic;
+// }
+// public void setDefaultPic(String defaultPic) {
+// this.defaultPic = defaultPic;
+// }
+ public boolean getGoodChecked() {
+ return goodChecked;
+ }
+ public void setGoodChecked(boolean goodChecked) {
+ this.goodChecked = goodChecked;
+ }
+
+ public int getIsFirst() {
+ return index;
+ }
+ public void setIsFirst(int index) {
+ this.index = index;
+ }
+
+ public int getGoodToShopId() {
+ return shopId;
+ }
+ public void setGoodToShopId(int shopId) {
+ this.shopId = shopId;
+ }
+
+ public boolean getIsShopSelect(){
+ return shopChecked;
+ }
+ public void setShopSelect(boolean shopChecked) {
+ this.shopChecked = shopChecked;
+ }
+
+ public int getProductId() {
+ return productId;
+ }
+ public void setProductId(int productId) {
+ this.productId = productId;
+ }
+
+ public String getShopName() {
+ return shopName;
+ }
+ public void setShopName(String shopName) {
+ this.shopName = shopName;
+ }
+
+
+ }
+
+}
+
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/bean/ProductData.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/bean/ProductData.java
new file mode 100644
index 0000000..42b5645
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/bean/ProductData.java
@@ -0,0 +1,90 @@
+package com.example.orangesale_02.bean;
+
+import com.example.orangesale_02.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ProductData {
+ private static int[] imgs =
+ new int[]{R.drawable.pig,R.drawable.chicken,R.drawable.turkey,R.drawable.chicken_leg,
+ R.drawable.bowl_one,R.drawable.chili,R.drawable.shrimp,R.drawable.fish};
+ private static String[] leftData =
+ new String[]{"13.9特价套餐","粗粮主食🍚","佐餐小吃🍟","用心营养套餐(不含主食)🍜",
+ "三杯鸡双拼尊享套餐🐔","带鱼双拼尊享套餐🐟","红烧肉双拼尊享套餐🐷"};
+ private static String[] rightData0 =
+ new String[]{"洋芋粉炒腊肉","土鸡炖香菇","新疆大盘辣子土鸡","清炖土鸡块",
+ "农家蒸碗 ","香辣野猪肉","香辣薯条大虾","麻辣鱼"};
+ private static String[] rightData1 =
+ new String[]{"商芝扣肉","羊肉萝卜","干烧鱼 ","干煸野猪肉 ","排骨火锅",
+ "土鸡火锅","牛肉火锅","狗肉火锅 "};
+ private static String[] rightData2 =
+ new String[]{"虎皮辣子炒咸肉","重庆飘香水煮鱼","红烧土鸡块","干煸辣子土鸡",
+ "清炖全鸡 "};
+ private static String[] rightData3 =
+ new String[]{"洋芋粉炒腊肉","土鸡炖香菇","新疆大盘辣子土鸡","清炖土鸡块",
+ "农家蒸碗 ","香辣野猪肉","香辣薯条大虾","麻辣猪血"};
+ private static String[] rightData4 =
+ new String[]{"洋芋粉炒腊肉","土鸡炖香菇","新疆大盘辣子土鸡","清炖土鸡块",
+ "农家蒸碗 ","香辣野猪肉","香辣薯条大虾","麻辣猪血"};
+ private static String[] rightData5 =
+ new String[]{"洋芋粉炒腊肉","土鸡炖香菇","新疆大盘辣子土鸡","清炖土鸡块",
+ "农家蒸碗 ","香辣野猪肉","香辣薯条大虾","麻辣猪血"};
+ private static String[] rightData6 =
+ new String[]{"洋芋粉炒腊肉","土鸡炖香菇","新疆大盘辣子土鸡","清炖土鸡块",
+ "农家蒸碗 ","香辣野猪肉","香辣薯条大虾","麻辣猪血"};
+
+ public static List getLeftData(){
+ List list = new ArrayList();
+ for (int i = 0; i < leftData.length; i++) {
+ ProductLeftBean bean = new ProductLeftBean();
+ bean.title = leftData[i];
+ bean.type = i;
+ list.add(bean);
+ }
+ return list;
+ }
+ public static List getRightData(List list){
+ ListrightList = new ArrayList();
+ for (int i = 0; i < list.size(); i++) {
+ ProductLeftBean leftBean = list.get(i);
+ int mType = leftBean.type;
+ switch (mType) {
+ case 0:
+ rightList = getRightList(rightData0, leftBean, mType, rightList);
+ break;
+ case 1:
+ rightList = getRightList(rightData1, leftBean, mType, rightList);
+ break;
+ case 2:
+ rightList = getRightList(rightData2, leftBean, mType, rightList);
+ break;
+ case 3:
+ rightList = getRightList(rightData3, leftBean, mType, rightList);
+ break;
+ case 4:
+ rightList = getRightList(rightData4, leftBean, mType, rightList);
+ break;
+ case 5:
+ rightList = getRightList(rightData5, leftBean, mType, rightList);
+ break;
+ case 6:
+ rightList = getRightList(rightData6, leftBean, mType, rightList);
+ break;
+ }
+ }
+ return rightList;
+ }
+ private static List getRightList(
+ String[] arr, ProductLeftBean leftBean,int mType, List rightList){
+ for (int j = 0; j < arr.length; j++) {
+ ProductRightBean bean = new ProductRightBean();
+ bean.type = leftBean.title;
+ bean.foodname = arr[j];
+ bean.typeId = mType;
+ bean.img = imgs[j];
+ rightList.add(bean);
+ }
+ return rightList;
+ }
+}
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/bean/ProductLeftBean.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/bean/ProductLeftBean.java
new file mode 100644
index 0000000..324750b
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/bean/ProductLeftBean.java
@@ -0,0 +1,7 @@
+package com.example.orangesale_02.bean;
+
+public class ProductLeftBean {
+ public String title;
+ public int type;
+
+}
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/bean/ProductRightBean.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/bean/ProductRightBean.java
new file mode 100644
index 0000000..bec6ef1
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/bean/ProductRightBean.java
@@ -0,0 +1,10 @@
+package com.example.orangesale_02.bean;
+
+public class ProductRightBean {
+
+ public String foodname;
+ public String type;
+ public int typeId;
+ public int img;
+}
+
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/bean/ShouyeGridIcon.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/bean/ShouyeGridIcon.java
new file mode 100644
index 0000000..7a7b9e2
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/bean/ShouyeGridIcon.java
@@ -0,0 +1,28 @@
+package com.example.orangesale_02.bean;
+
+public class ShouyeGridIcon {
+ private int iId;
+ private String iName;
+ public ShouyeGridIcon() {
+ }
+
+ public ShouyeGridIcon(int iId, String iName) {
+ this.iId = iId;
+ this.iName = iName;
+ }
+
+ public int getiId() {
+ return iId;
+ }
+ public void setiId(int iId) {
+ this.iId = iId;
+ }
+
+ public String getiName() {
+ return iName;
+ }
+ public void setiName(String iName) {
+ this.iName = iName;
+ }
+
+}
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/custominterface/GoodsCallback.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/custominterface/GoodsCallback.java
new file mode 100644
index 0000000..66d6551
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/custominterface/GoodsCallback.java
@@ -0,0 +1,33 @@
+package com.example.orangesale_02.custominterface;
+
+import android.view.View;
+
+import com.example.orangesale_02.bean.ChatBean;
+
+import java.util.List;
+
+/**
+ * 商品回调接口
+ * @author llw
+ */
+public interface GoodsCallback {
+ /**
+ * 计算商品价格
+ */
+ void calculationPrice();
+
+ /**
+ * 根据商品的选中数量,确定是否选中店铺
+ */
+ void selectAllStore(int shopId, boolean state);
+
+ /**
+ * 商品选中时的删除事件
+ */
+ void deleteCheckedGoods();
+
+ /**
+ * 商品未选中时的删除事件
+ */
+ void deleteUncheckedGoods(int shopId);
+}
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/custominterface/OnDeleteClickListener.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/custominterface/OnDeleteClickListener.java
new file mode 100644
index 0000000..c52ccd0
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/custominterface/OnDeleteClickListener.java
@@ -0,0 +1,7 @@
+package com.example.orangesale_02.custominterface;
+
+import android.view.View;
+
+public interface OnDeleteClickListener {
+ void onDeleteClick(View view, int position, int cartid);
+}
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/custominterface/OnEditClickListener.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/custominterface/OnEditClickListener.java
new file mode 100644
index 0000000..1e7a0ac
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/custominterface/OnEditClickListener.java
@@ -0,0 +1,5 @@
+package com.example.orangesale_02.custominterface;
+
+public interface OnEditClickListener {
+ void onEditClick(int position, int cartid, int count);
+}
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/custominterface/StoreCallback.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/custominterface/StoreCallback.java
new file mode 100644
index 0000000..6022982
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/custominterface/StoreCallback.java
@@ -0,0 +1,13 @@
+package com.example.orangesale_02.custominterface;
+
+public interface StoreCallback {
+ /**
+ * 结算按钮的UI
+ */
+ void allPrice(double totalPrice, int totalCount);
+
+ /**
+ * 全选按钮的UI
+ */
+ void isSelectAll(boolean b);
+}
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/database/OrangeDatabase.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/database/OrangeDatabase.java
new file mode 100644
index 0000000..cc36b04
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/database/OrangeDatabase.java
@@ -0,0 +1,106 @@
+package com.example.orangesale_02.database;
+
+import android.annotation.SuppressLint;
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.os.Bundle;
+import android.util.Log;
+
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class OrangeDatabase extends SQLiteOpenHelper {
+ public List list = new ArrayList();
+
+ public OrangeDatabase(@Nullable Context context){
+ super(context, "orange", null, 1);
+ }
+
+ //数据库第一次创建时调用该方法
+ @Override
+ public void onCreate(SQLiteDatabase sqLiteDatabase) {
+ String sql = "create table orange_user(id integer primary key autoincrement, " +
+ "username varchar(50), password varchar(50), sex varchar(10), city carchar(50))";
+ sqLiteDatabase.execSQL(sql);//execSQL 执行一条占位符SQL语句
+ }
+
+ //数据库版本号更新时调用
+ @Override
+ public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
+ }
+
+ //增加数据
+ public void insert(OrangeDatabase orangeDatabase, String table, String username,
+ String password, String sex, String city) {
+ SQLiteDatabase sqLiteDatabase = orangeDatabase.getWritableDatabase();
+ ContentValues values = new ContentValues();
+ values.put("username", username);
+ values.put("password", password);
+ values.put("sex", sex);
+ values.put("city", city);
+ sqLiteDatabase.insert(table,null,values);
+ sqLiteDatabase.close();
+ }
+
+ //删除数据
+ public void delete(OrangeDatabase orangeDatabase, String table, int id) {
+ SQLiteDatabase sqLiteDatabase = orangeDatabase.getWritableDatabase();
+ sqLiteDatabase.delete(table,"id=?", new String[]{id + ""});
+ sqLiteDatabase.close();
+ }
+
+ //更新数据
+ public void update(OrangeDatabase orangeDatabase, String table, int id, String username,
+ String password, String sex, String city) {
+ SQLiteDatabase sqLiteDatabase = orangeDatabase.getWritableDatabase();
+ ContentValues values = new ContentValues();
+ values.put("username", username);
+ values.put("password", password);
+ values.put("sex", sex);
+ values.put("city", city);
+ sqLiteDatabase.update(table, values, "id=?", new String[]{id + ""});
+ sqLiteDatabase.close();
+ }
+
+ //查询数据库
+ public void query(OrangeDatabase orangeDatabase, String table){
+ SQLiteDatabase sqLiteDatabase = orangeDatabase.getWritableDatabase();
+ Cursor c = sqLiteDatabase.query(table, null,
+ null, null,null,
+ null,null);//游标接口,相当于结果集ResultSet
+
+ while (c.moveToNext()){//移动光标到下一行
+ //getColumnIndex,返回指定列的名称,若不存在返回-1
+ @SuppressLint("Range") int id = c.getInt(c.getColumnIndex("id"));
+ @SuppressLint("Range") String username = c.getString(1);
+ @SuppressLint("Range") String password = c.getString(2);
+ @SuppressLint("Range") String sex = c.getString(3);
+ @SuppressLint("Range") String city = c.getString(4);
+ list.add(new UserInfo(id,username,password,sex,city));
+ Log.i("query result: ",list.toString());
+ }
+ c.close();//关闭游标
+ sqLiteDatabase.close();//关闭数据库
+ }
+
+ //查询数据
+ public Bundle queryUserInfo(SQLiteDatabase sqLiteDatabase, Bundle bundle){
+ String username = bundle.getString("username");
+ Cursor cursor = sqLiteDatabase.rawQuery("select * from orange_user where username = ?",
+ new String[]{username});
+ if (cursor != null){
+ while(cursor.moveToNext()){
+ bundle.putString("sex", cursor.getString(3));
+ bundle.putString("city", cursor.getString(4));
+ }
+ }
+ cursor.close();
+ sqLiteDatabase.close();
+ return bundle;
+ }
+}
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/database/UserInfo.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/database/UserInfo.java
new file mode 100644
index 0000000..66e8783
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/database/UserInfo.java
@@ -0,0 +1,64 @@
+package com.example.orangesale_02.database;
+
+public class UserInfo {
+ private int id;
+ private String username;
+ private String password;
+ private String sex;
+ private String city;
+
+ //构造方法
+ public UserInfo(int id, String username, String password, String sex, String city){
+ this.id = id;
+ this.username = username;
+ this.password = password;
+ this.sex = sex;
+ this.city = city;
+ }
+
+ public void setId(int id){
+ this.id = id;
+ }
+
+ public void setUsername( String username){
+ this.username = username;
+ }
+
+ public void setPaswd( String password){
+ this.password = password;
+ }
+
+ public void setSex( String sex){
+ this.sex = sex;
+ }
+
+ public void setCity( String city){
+ this.city = city;
+ }
+
+ public int getId(){
+ return id;
+ }
+
+ public String getUsername(){
+ return username;
+ }
+
+ public String getPassword(){
+ return password;
+ }
+
+ public String getSex(){
+ return sex;
+ }
+
+ public String getCity(){
+ return city;
+ }
+
+ @Override
+ public String toString(){
+ return "userInfo{ "+" id="+id+", username="+username+", paswd="+password
+ +", sex="+sex+", city="+city+"}";
+ }
+}
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/fragment/BottomBar_cart.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/fragment/BottomBar_cart.java
new file mode 100644
index 0000000..b236971
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/fragment/BottomBar_cart.java
@@ -0,0 +1,265 @@
+package com.example.orangesale_02.fragment;
+
+import android.app.AlertDialog;
+import android.os.Bundle;
+//import android.support.v7.widget.LinearLayoutManager;
+//import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.example.orangesale_02.R;
+import com.example.orangesale_02.adapter.ShopCartAdapter;
+import com.example.orangesale_02.bean.ChatBean;
+import com.example.orangesale_02.custominterface.StoreCallback;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class BottomBar_cart extends Fragment implements View.OnClickListener
+, StoreCallback {
+
+ private LinearLayout lay_edit;
+ private TextView tv_total,tv_edit,tv_commit,tv_share_goods,tv_collect_goods,tv_delete_goods;
+ private ImageView iv_selectAll;
+ private RecyclerView rvStore;
+
+ private List shopsList = new ArrayList<>();
+ private List goodsList = new ArrayList<>();
+ private ShopCartAdapter mShopCartAdapter;
+ private AlertDialog dialog;//弹窗
+ private RefreshLayout refresh;//刷新布局
+ private LinearLayout layEmpty;//空布局
+
+ private boolean isEdit = false;//是否编辑
+ private boolean isAllChecked = false;//是否全选
+ private boolean isHaveGoods = false;//购物车是否有商品
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState){
+ View view = inflater.inflate(R.layout.bottom_bar_cart, container, false);
+ return view;
+ }
+ //一般onCreateView()用于初始化Fragment的视图,
+ // onViewCreated()一般用于初始化视图内各个控件,
+ // 而onCreate()用于初始化与Fragment视图无关的变量。
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ initData();
+ }
+
+ /**
+ * 初始化UI
+ */
+ private void initData(){
+ //绑定首页控件
+ tv_edit = getActivity().findViewById(R.id.tv_edit);//编辑
+ lay_edit = getActivity().findViewById(R.id.lay_edit);
+ iv_selectAll= getActivity().findViewById(R.id.iv_selectAll);
+ tv_total = getActivity().findViewById(R.id.tv_total);
+ tv_commit= getActivity().findViewById(R.id.tv_commit);
+ rvStore = getActivity().findViewById(R.id.recycleview);
+ tv_share_goods = getActivity().findViewById(R.id.tv_share_goods);
+ tv_collect_goods = getActivity().findViewById(R.id.tv_collect_goods);
+ tv_delete_goods = getActivity().findViewById(R.id.tv_delete_goods);
+ refresh = getActivity().findViewById(R.id.refresh);
+ layEmpty = getActivity().findViewById(R.id.lay_empty);
+
+ //首页控件添加点击事件
+ tv_edit.setOnClickListener((View.OnClickListener) this);
+ iv_selectAll.setOnClickListener((View.OnClickListener) this);
+ tv_commit.setOnClickListener((View.OnClickListener) this);
+ tv_share_goods.setOnClickListener((View.OnClickListener) this);
+ tv_collect_goods.setOnClickListener((View.OnClickListener) this);
+ tv_delete_goods.setOnClickListener((View.OnClickListener) this);
+
+ //绑定商铺适配器
+ rvStore.setLayoutManager(new LinearLayoutManager(getActivity()));
+ mShopCartAdapter = new ShopCartAdapter(getActivity(),shopsList,this);
+ rvStore.setAdapter(mShopCartAdapter);
+
+ ChatBean.ChatItem waitao = new ChatBean.ChatItem("可乐",
+ R.drawable.cola,"卡其","均码",1,2);
+ waitao.setProductId(0);
+ ChatBean.ChatItem maozi = new ChatBean.ChatItem("汉堡",
+ R.drawable.hamburger,"卡其","均码",1,2);
+ maozi.setProductId(1);
+ goodsList.add(waitao);
+ goodsList.add(maozi);
+
+ List goodsList1 = new ArrayList<>();
+ ChatBean.ChatItem yifu = new ChatBean.ChatItem("披萨🍕",
+ R.drawable.cat_1,"卡其","均码",1,2);
+ yifu.setProductId(0);
+ goodsList1.add(yifu);
+
+ //商店初始化数据
+ shopsList.add(new ChatBean("ww店", 0,goodsList));
+ shopsList.add(new ChatBean("SS店", 1,goodsList1));
+
+ isHaveGoods = true; //购物车有商品
+ refresh.finishRefresh(); //下拉加载数据完成后,关闭下拉刷新动画
+ layEmpty.setVisibility(View.GONE);//隐藏布局
+
+ //禁用下拉刷新和上拉加载更多
+ refresh.setEnableRefresh(false);
+ refresh.setEnableLoadMore(false);
+ //下拉刷新监听
+ refresh.setOnRefreshListener(refreshLayout -> initData());
+
+ }
+ /**
+ * 页面控件点击事件
+ */
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.tv_edit://编辑
+ if (!isHaveGoods){
+ showMsg("当前购物车空空如也");
+ return;
+ }
+ if (isEdit) {
+ tv_edit.setText("编辑");
+ lay_edit.setVisibility(View.GONE);
+ isEdit = false;
+ } else {
+ tv_edit.setText("完成");
+ lay_edit.setVisibility(View.VISIBLE);
+ isEdit = true;
+ }
+ break;
+ case R.id.iv_selectAll://全选
+ if (!isHaveGoods){
+ showMsg("当前购物车空空如也");
+ return;
+ }
+ if (isAllChecked){
+ selectAllAct(false);//取消全选
+ }else{
+ selectAllAct(true);//全选
+ }
+ break;
+ case R.id.tv_commit://结算
+ if (!isHaveGoods){
+ showMsg("当前购物车空空如也");
+ return;
+ }
+ if (mShopCartAdapter.totalCount == 0){
+ showMsg("请选择要结算的商品");
+ return;
+ }
+ //弹窗
+ dialog = new AlertDialog.Builder(getContext())
+ .setMessage("总计:" + mShopCartAdapter.totalCount + "种商品,"
+ + mShopCartAdapter.totalPrice + "元")
+ .setPositiveButton("确定", (dialog, which) ->
+ mShopCartAdapter.deleteCheckedGoods())
+ .setNegativeButton("取消", (dialog, which) -> dialog.dismiss())
+ .create();
+ dialog.show();
+ break;
+ case R.id.tv_delete_goods://删除
+ if (mShopCartAdapter.totalCount == 0){
+ showMsg("请选择要删除的商品");
+ return;
+ }
+ //弹窗
+ dialog = new AlertDialog.Builder(getContext())
+ .setMessage("确定要删除所选商品吗?")
+ .setPositiveButton("确定",(dialog,which)->
+ mShopCartAdapter.deleteCheckedGoods())
+ .setNegativeButton("取消",(dialog,which)-> dialog.dismiss())
+ .create();
+ dialog.show();
+ //改变界面UI
+ tv_edit.setText("编辑");
+ lay_edit.setVisibility(View.GONE);
+ isEdit = false;
+ break;
+ case R.id.tv_collect_goods://收藏
+ if (mShopCartAdapter.totalCount == 0){
+ showMsg("请选择要收藏的商品");
+ return;
+ }
+ showMsg("收藏成功");
+ break;
+ case R.id.tv_share_goods://分享
+ if (mShopCartAdapter.totalCount == 0){
+ showMsg("请选择要分享的商品");
+ return;
+ }
+ showMsg("分享成功");
+ break;
+ default:
+ break;
+ }
+ }
+
+ /**
+ * StoreCallback 回调
+ * 主页结算按钮 -- UI显示
+ */
+ @Override
+ public void allPrice(double totalPrice, int totalCount) {
+ tv_total.setText("¥" + mShopCartAdapter.totalPrice);
+ tv_commit.setText( mShopCartAdapter.totalCount
+ == 0 ? "结算" : "结算(" + mShopCartAdapter.totalCount + ")");
+ if (shopsList.size() <= 0 ){
+ isHaveGoods = false; //购物车无商品
+ refresh.setEnableRefresh(true); //启动下拉刷新动画
+ layEmpty.setVisibility(View.VISIBLE);//显示空布局
+ }
+ }
+
+ /**
+ * StoreCallback 回调
+ * 主页全选按钮-- 接收传递值,修改UI
+ */
+ @Override
+ public void isSelectAll(boolean state) {
+ iv_selectAll.setImageDrawable(getResources().getDrawable(
+ state ? R.drawable.ic_checked : R.drawable.ic_check));
+ isAllChecked = state;
+ }
+
+ /****************************自定义方法*************************************************/
+ /**
+ * 主页全选按钮的点击事件
+ * @param state 状态
+ */
+ private void selectAllAct(boolean state) {
+ //修改背景
+ iv_selectAll.setImageDrawable(getResources().getDrawable(
+ state ? R.drawable.ic_checked : R.drawable.ic_check));
+ for (ChatBean shop : shopsList) {
+ //商品是否选中
+ mShopCartAdapter.selectAllGoods(shop.getShopId(), state);
+ //店铺是否选中
+ mShopCartAdapter.selectAllStore(shop.getShopId(), state);
+ }
+ isAllChecked = state;
+ }
+
+ /**
+ * Toast提示
+ * @param msg
+ */
+ private void showMsg(String msg) {
+ Toast.makeText(getActivity(),msg,Toast.LENGTH_SHORT).show();
+ }
+
+}
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/fragment/BottomBar_product.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/fragment/BottomBar_product.java
new file mode 100644
index 0000000..96737b2
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/fragment/BottomBar_product.java
@@ -0,0 +1,156 @@
+package com.example.orangesale_02.fragment;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AbsListView;
+import android.widget.AdapterView;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.example.orangesale_02.R;
+import com.example.orangesale_02.adapter.BottomBar_fragmentAdapter;
+import com.example.orangesale_02.adapter.ProductLeftAdapter;
+import com.example.orangesale_02.adapter.ProductRightAdapter;
+import com.example.orangesale_02.bean.ProductData;
+import com.example.orangesale_02.bean.ProductLeftBean;
+import com.example.orangesale_02.bean.ProductRightBean;
+
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import se.emilsjolander.stickylistheaders.StickyListHeadersListView;
+
+public class BottomBar_product extends Fragment implements AbsListView.OnScrollListener {
+
+ private ListView lv_left;
+ private StickyListHeadersListView lv_right;
+ private int currentLeftItem;
+ ProductLeftAdapter leftAdapter;
+ ProductRightAdapter rightAdapter;
+ List leftData;
+ List rightData;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState){
+ View view = inflater.inflate(R.layout.bottom_bar_product, container, false);
+ return view;
+ }
+ //一般onCreateView()用于初始化Fragment的视图,
+ // onViewCreated()一般用于初始化视图内各个控件,
+ // 而onCreate()用于初始化与Fragment视图无关的变量。
+ @Override
+ public void onViewCreated(@NonNull View view, @androidx.annotation.Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ lv_left = view.findViewById(R.id.lv_left);
+ lv_right = view.findViewById(R.id.lv_right);
+
+ initData();
+ }
+
+ private void initData() {
+ //创建适配器
+ leftAdapter = new ProductLeftAdapter(ProductData.getLeftData());
+ //获取左侧数据
+ leftData = ProductData.getLeftData();
+ //获取右侧数据
+ rightData = ProductData.getRightData(leftData);
+ rightAdapter = new ProductRightAdapter(leftData, rightData, getContext());
+ //为左侧布局设置适配器
+ lv_left.setAdapter(leftAdapter);
+ lv_right.setAdapter(rightAdapter);
+ //为左侧条目设置点击事件
+ lv_left.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView parent, View view, int position, long id) {
+ //当左侧条目被点击时,记录下被点击条目的type
+ int type = leftData.get(position).type;
+ leftAdapter.isClickLeft = true;
+ //遍历右侧条目,并获取右侧条目的typeId,与刚刚获取的type对比,是否一致
+ for (int i = 0; i < rightData.size(); i++) {
+ if (type == rightData.get(i).typeId) {
+ //如果找到对应的条目,那就将右侧条目滚动至对应条目,并跳出循环
+ lv_right.smoothScrollToPosition(i);
+ currentLeftItem = i;
+ //左侧条目点击事件,设置UI
+ leftAdapter.setCurrentSelect_Left(position);
+ //刷新数据适配器
+ leftAdapter.notifyDataSetChanged();
+ break;
+ }
+ }
+// Toast.makeText(getActivity(),
+// "您选中了"+leftData.get(position).title, Toast.LENGTH_SHORT).show();
+ }
+ });
+ //为右侧条目设置点击事件
+ lv_right.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView parent, View view, int position, long id) {
+// Toast.makeText(getActivity(),
+// "右侧条目被点击了"+position, Toast.LENGTH_SHORT).show();
+ //当右侧条目被点击时,获取被点击条目的typeId
+ int typeId = rightData.get(position).typeId;
+ leftAdapter.isClickLeft = false;
+ //遍历左侧条目
+ for (int i = 0; i < leftData.size(); i++) {
+ //获取左侧条目的type,与右侧条目的typeId对比是否一致
+ if (typeId == leftData.get(i).type) {
+ //说明找到了对应条目,跳出循环,设置当前被选中的条目
+ currentLeftItem = i;
+ //右侧滚动或点击,设置对应的左侧条目UI
+ leftAdapter.setCurrentSelect_Right(currentLeftItem);
+ //刷新数据适配器
+ leftAdapter.notifyDataSetChanged();
+ break;
+ }
+ }
+ }
+ });
+ //为右侧条目添加滑动监听
+ lv_right.setOnScrollListener(this);
+ }
+ /**
+ * 右边滑动的事件
+ * */
+ @Override
+ public void onScrollStateChanged(AbsListView view, int scrollState) {
+ }
+ /**
+ * 右边滑动的事件
+ * */
+ @Override
+ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
+ ProductRightBean data = rightData.get(firstVisibleItem);
+ leftAdapter.isClickLeft = false;
+ for (int i = 0; i < leftData.size(); i++) {
+ //获取左侧条目的type,与右侧条目的typeId对比是否一致
+ if (data.typeId == leftData.get(i).type) {
+ //说明找到了对应条目,跳出循环,设置当前被选中的条目
+ currentLeftItem = i;
+ //右侧滚动或点击,设置对应的左侧条目UI
+ leftAdapter.setCurrentSelect_Right(currentLeftItem);
+ //刷新数据适配器
+ leftAdapter.notifyDataSetChanged();
+ break;
+ }
+ }
+ int firdtVisiblePositon = lv_left.getFirstVisiblePosition();
+ int lastVisiblePositon = lv_left.getLastVisiblePosition();
+ if (data.typeId >= lastVisiblePositon || data.typeId <= firdtVisiblePositon){
+ lv_left.setSelection(data.typeId);
+ }
+// Log.i("ProductRightBean","" + data.typeId);
+ }
+}
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/fragment/BottomBar_profile.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/fragment/BottomBar_profile.java
new file mode 100644
index 0000000..d741b75
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/fragment/BottomBar_profile.java
@@ -0,0 +1,76 @@
+package com.example.orangesale_02.fragment;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.example.orangesale_02.activity.MainActivity;
+import com.example.orangesale_02.R;
+
+public class BottomBar_profile extends Fragment {
+ public BottomBar_profile(){}
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState){
+ View view = inflater.inflate(R.layout.bottom_bar_profile, container, false);
+ return view;
+ }
+
+ //一般onCreateView()用于初始化Fragment的视图,
+ // onViewCreated()一般用于初始化视图内各个控件,
+ // 而onCreate()用于初始化与Fragment视图无关的变量。
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ if (MainActivity.instance.loginIn) {
+ //从登录选项进入,从textView获取个人信息
+ Intent intent = getActivity().getIntent();
+ Bundle bundle = intent.getExtras();
+ String username = bundle.getString("username");
+ String sex = bundle.getString("sex");
+ String city = bundle.getString("city");
+
+ TextView user_username = getActivity().findViewById(R.id.user_username1);
+ user_username.setText("用户名:"+username);
+ TextView user_sex = getActivity().findViewById(R.id.user_sex1);
+ user_sex.setText("性别:"+sex);
+ TextView user_city = getActivity().findViewById(R.id.user_city1);
+ user_city.setText("城市:"+city);
+ }else{
+ Intent intent = getActivity().getIntent();
+ Bundle bundle = intent.getExtras();
+ String username = bundle.getString("username");
+ String sex = bundle.getString("sex");
+ String city = bundle.getString("city");
+
+ TextView user_username = getActivity().findViewById(R.id.user_username1);
+ user_username.setText("用户名:"+username);
+ TextView user_sex = getActivity().findViewById(R.id.user_sex1);
+ user_sex.setText("性别:"+sex);
+ TextView user_city = getActivity().findViewById(R.id.user_city1);
+ user_city.setText("城市:"+city);
+ }
+
+ //点击事件
+ Button loginoutButton = (Button) getActivity().findViewById(R.id.loginout1);
+ loginoutButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //从fragment跳转到activity中
+ startActivity(new Intent(getActivity(), MainActivity.class));
+ }
+ });
+ }
+
+
+}
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/fragment/BottomBar_shouye.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/fragment/BottomBar_shouye.java
new file mode 100644
index 0000000..33ac3fb
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/fragment/BottomBar_shouye.java
@@ -0,0 +1,75 @@
+package com.example.orangesale_02.fragment;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.GridView;
+import android.widget.Toast;
+
+import com.example.orangesale_02.R;
+import com.example.orangesale_02.adapter.ShouyeGridBaseA;
+import com.example.orangesale_02.bean.ShouyeGridIcon;
+
+import java.util.ArrayList;
+
+public class BottomBar_shouye extends Fragment {
+
+ private Context mContext;
+ private GridView gridView;
+ private GridView firegridView;
+ private BaseAdapter mAdapter = null;
+ private ArrayList mData = null;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState){
+ View view = inflater.inflate(R.layout.bottom_bar_shouye, container, false);
+ return view;
+ }
+ //一般onCreateView()用于初始化Fragment的视图,
+ // onViewCreated()一般用于初始化视图内各个控件,
+ // 而onCreate()用于初始化与Fragment视图无关的变量。
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ gridView = view.findViewById(R.id.gridview);
+ firegridView = view.findViewById(R.id.firegridview);
+
+ mData = new ArrayList();
+ mData.add(new ShouyeGridIcon(R.drawable.chicken, "chicken"));
+ mData.add(new ShouyeGridIcon(R.drawable.chicken_leg, "chicken_leg"));
+ mData.add(new ShouyeGridIcon(R.drawable.fish, "fish"));
+ mData.add(new ShouyeGridIcon(R.drawable.hamburger, "hamburger"));
+ mData.add(new ShouyeGridIcon(R.drawable.pig, "pig"));
+ mData.add(new ShouyeGridIcon(R.drawable.turkey, "turkey"));
+ mData.add(new ShouyeGridIcon(R.drawable.shrimp, "shrimp"));
+
+ mAdapter = new ShouyeGridBaseA(mData);
+ gridView.setAdapter(mAdapter);
+ firegridView.setAdapter(mAdapter);
+
+ gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView parent, View view, int position, long id) {
+ Toast.makeText(getActivity(),
+ "你点击了~" + position + "~项", Toast.LENGTH_SHORT).show();
+ }
+ });
+ firegridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView parent, View view, int position, long id) {
+ Toast.makeText(getActivity(),
+ "你点击了~" + position + "~项", Toast.LENGTH_SHORT).show();
+ }
+ });
+ }
+
+}
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/util/AdapterUtils.kt b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/util/AdapterUtils.kt
new file mode 100644
index 0000000..3667163
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/util/AdapterUtils.kt
@@ -0,0 +1,16 @@
+package com.example.orangesale_02.util
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.annotation.LayoutRes
+
+/**
+ * 扩展方法,用于获取View
+ * @receiver ViewGroup parent
+ * @param layoutResId Int
+ * @return View
+ */
+fun ViewGroup.getItemView(@LayoutRes layoutResId: Int): View {
+ return LayoutInflater.from(this.context).inflate(layoutResId, this, false)
+}
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/java/com/example/orangesale_02/util/Constant.java b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/util/Constant.java
new file mode 100644
index 0000000..15ca2ff
--- /dev/null
+++ b/OrangeSale_02/app/src/main/java/com/example/orangesale_02/util/Constant.java
@@ -0,0 +1,94 @@
+package com.example.orangesale_02.util;
+/**
+ * 常量
+ * @author llw
+ */
+public class Constant {
+
+ public static final String CAR_JSON = "{ \"code\" : 200 ,\n" +
+ " \"orderData\" : [\n" +
+ " {\n" +
+ "\n" +
+ " \"shopId\": 1,\n" +
+ " \"shopName\":\"京东自营\",\n" +
+ " \"cartlist\": [\n" +
+ " {\n" +
+ " \"id\": 1,\n" +
+ " \"shopId\": 1,\n" +
+ " \"shopName\": \"京东自营\",\n" +
+ " \"defaultPic\": \"https://img30.360buyimg.com/popWareDetail/jfs/t3208/194/7616404169/244198/369625db/58b7d093N03520fb7.jpg\",\n" +
+ " \"productId\": 1,\n" +
+ " \"productName\": \"三只松鼠_零食大礼包\",\n" +
+ " \"color\": \"黑色\",\n" +
+ " \"size\": \"18L\",\n" +
+ " \"price\": 20,\n" +
+ " \"count\":1\n" +
+ " },\n" +
+ " {\n" +
+ " \"id\": 2,\n" +
+ " \"shopId\": 1,\n" +
+ " \"shopName\": \"京东自营\",\n" +
+ " \"defaultPic\": \"https://img14.360buyimg.com/n0/jfs/t2971/15/167732091/93002/204c1016/574d9d9aNe4e6fa7a.jpg\",\n" +
+ " \"productId\": 2,\n" +
+ " \"productName\": \"小米心跳手环\",\n" +
+ " \"color\": \"白色\",\n" +
+ " \"size\": \"20XXL\",\n" +
+ " \"price\": 148,\n" +
+ " \"count\": 1\n" +
+ " }\n" +
+ " ]\n" +
+ " }\n" +
+ " ,\n" +
+ " {\n" +
+ " \"shopId\": 2,\n" +
+ " \"shopName\":\"海澜之家\",\n" +
+ " \"cartlist\": [\n" +
+ " {\n" +
+ " \"id\": 1,\n" +
+ " \"shopId\": 2,\n" +
+ " \"shopName\": \"海澜之家\",\n" +
+ " \"defaultPic\": \"https://img30.360buyimg.com/popWaterMark/jfs/t4075/83/1343091204/132469/9034cb9c/5873496bN68020ba8.jpg\",\n" +
+ " \"productId\": 1,\n" +
+ " \"productName\": \"短袖T恤男 2017夏季新品\",\n" +
+ " \"color\": \"蓝色\",\n" +
+ " \"size\": \"30X\",\n" +
+ " \"price\": 181,\n" +
+ " \"count\":1\n" +
+ " }\n" +
+ " ]\n" +
+ " }\n" +
+ " ,\n" +
+ " {\n" +
+ " \"shopId\": 3,\n" +
+ " \"shopName\":\"OPPO官方旗舰店\",\n" +
+ " \"cartlist\": [\n" +
+ " {\n" +
+ " \"id\": 1,\n" +
+ " \"shopId\": 3,\n" +
+ " \"shopName\": \"OPPO官方旗舰店\",\n" +
+ " \"defaultPic\": \"https://img10.360buyimg.com/cms/jfs/t6064/272/2163314583/157700/442d6477/593c1c49N7c63a7d9.jpg\",\n" +
+ " \"productId\": 1,\n" +
+ " \"productName\": \"OPPO R11 全网通\",\n" +
+ " \"color\": \"蓝色\",\n" +
+ " \"size\": \"30X\",\n" +
+ " \"price\": 1999,\n" +
+ " \"count\":1\n" +
+ " },\n" +
+ " {\n" +
+ " \"id\": 2,\n" +
+ " \"shopId\": 3,\n" +
+ " \"shopName\": \"OPPO官方旗舰店\",\n" +
+ " \"defaultPic\": \"https://img14.360buyimg.com/n0/jfs/t3142/194/4953241722/254855/1651c2b1/585b9021Nf653e48a.jpg\",\n" +
+ " \"productId\": 1,\n" +
+ " \"productName\": \"OPPO R9 全网通\",\n" +
+ " \"color\": \"蓝色\",\n" +
+ " \"size\": \"30X\",\n" +
+ " \"price\": 999,\n" +
+ " \"count\":1\n" +
+ " }\n" +
+ " ]\n" +
+ " }\n" +
+ "\n" +
+ " ]\n" +
+ "}";
+}
diff --git a/OrangeSale_02/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/OrangeSale_02/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/bottom_btn2.png b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/bottom_btn2.png
new file mode 100644
index 0000000..8a4857c
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/bottom_btn2.png differ
diff --git a/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/bottom_btn3.png b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/bottom_btn3.png
new file mode 100644
index 0000000..4bec370
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/bottom_btn3.png differ
diff --git a/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/cat_1.png b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/cat_1.png
new file mode 100644
index 0000000..01779b0
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/cat_1.png differ
diff --git a/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/cat_2.png b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/cat_2.png
new file mode 100644
index 0000000..a2f1102
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/cat_2.png differ
diff --git a/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/cat_3.png b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/cat_3.png
new file mode 100644
index 0000000..48a8d0c
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/cat_3.png differ
diff --git a/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/cat_4.png b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/cat_4.png
new file mode 100644
index 0000000..f242d8b
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/cat_4.png differ
diff --git a/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/chronometer.png b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/chronometer.png
new file mode 100644
index 0000000..c6a1809
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/chronometer.png differ
diff --git a/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/logo.png b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/logo.png
new file mode 100644
index 0000000..ccdd1bd
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/logo.png differ
diff --git a/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/minus.png b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/minus.png
new file mode 100644
index 0000000..7d16b56
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/minus.png differ
diff --git a/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/profile.png b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/profile.png
new file mode 100644
index 0000000..4f4e62d
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/profile.png differ
diff --git a/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/star.png b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/star.png
new file mode 100644
index 0000000..0df90cf
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/drawable-xxxhdpi/star.png differ
diff --git a/OrangeSale_02/app/src/main/res/drawable/apple_one.xml b/OrangeSale_02/app/src/main/res/drawable/apple_one.xml
new file mode 100644
index 0000000..b3eb29d
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/apple_one.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/avocado.xml b/OrangeSale_02/app/src/main/res/drawable/avocado.xml
new file mode 100644
index 0000000..60b5b83
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/avocado.xml
@@ -0,0 +1,16 @@
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/b_nav_selector.xml b/OrangeSale_02/app/src/main/res/drawable/b_nav_selector.xml
new file mode 100644
index 0000000..dcd3ffc
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/b_nav_selector.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/drawable/banana.xml b/OrangeSale_02/app/src/main/res/drawable/banana.xml
new file mode 100644
index 0000000..38908c6
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/banana.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/bg_goods_num.xml b/OrangeSale_02/app/src/main/res/drawable/bg_goods_num.xml
new file mode 100644
index 0000000..7ef60a2
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/bg_goods_num.xml
@@ -0,0 +1,5 @@
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/drawable/bg_increase_goods_num.xml b/OrangeSale_02/app/src/main/res/drawable/bg_increase_goods_num.xml
new file mode 100644
index 0000000..d049da2
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/bg_increase_goods_num.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/drawable/bg_reduce_goods_num.xml b/OrangeSale_02/app/src/main/res/drawable/bg_reduce_goods_num.xml
new file mode 100644
index 0000000..f071253
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/bg_reduce_goods_num.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/drawable/bg_settlement.xml b/OrangeSale_02/app/src/main/res/drawable/bg_settlement.xml
new file mode 100644
index 0000000..be029bd
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/bg_settlement.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/drawable/bg_white_8.xml b/OrangeSale_02/app/src/main/res/drawable/bg_white_8.xml
new file mode 100644
index 0000000..5adf7f0
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/bg_white_8.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/drawable/bowl_one.xml b/OrangeSale_02/app/src/main/res/drawable/bowl_one.xml
new file mode 100644
index 0000000..e75eef7
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/bowl_one.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/canned_fruit.xml b/OrangeSale_02/app/src/main/res/drawable/canned_fruit.xml
new file mode 100644
index 0000000..648c68f
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/canned_fruit.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/carrot.xml b/OrangeSale_02/app/src/main/res/drawable/carrot.xml
new file mode 100644
index 0000000..f6b7a4b
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/carrot.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/cherry.xml b/OrangeSale_02/app/src/main/res/drawable/cherry.xml
new file mode 100644
index 0000000..73b45c2
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/cherry.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/chicken.xml b/OrangeSale_02/app/src/main/res/drawable/chicken.xml
new file mode 100644
index 0000000..a5c26a7
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/chicken.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/chicken_leg.xml b/OrangeSale_02/app/src/main/res/drawable/chicken_leg.xml
new file mode 100644
index 0000000..cd52bf5
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/chicken_leg.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/chili.xml b/OrangeSale_02/app/src/main/res/drawable/chili.xml
new file mode 100644
index 0000000..e5dc762
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/chili.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/circle_double_down.xml b/OrangeSale_02/app/src/main/res/drawable/circle_double_down.xml
new file mode 100644
index 0000000..231af15
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/circle_double_down.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/cola.xml b/OrangeSale_02/app/src/main/res/drawable/cola.xml
new file mode 100644
index 0000000..95a0c61
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/cola.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/commodity.xml b/OrangeSale_02/app/src/main/res/drawable/commodity.xml
new file mode 100644
index 0000000..85289d7
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/commodity.xml
@@ -0,0 +1,19 @@
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/coupon.xml b/OrangeSale_02/app/src/main/res/drawable/coupon.xml
new file mode 100644
index 0000000..42c383c
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/coupon.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/down.xml b/OrangeSale_02/app/src/main/res/drawable/down.xml
new file mode 100644
index 0000000..4a039fd
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/down.xml
@@ -0,0 +1,13 @@
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/fire.xml b/OrangeSale_02/app/src/main/res/drawable/fire.xml
new file mode 100644
index 0000000..dcf2f32
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/fire.xml
@@ -0,0 +1,12 @@
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/fish.xml b/OrangeSale_02/app/src/main/res/drawable/fish.xml
new file mode 100644
index 0000000..d2ec346
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/fish.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/hamburger.xml b/OrangeSale_02/app/src/main/res/drawable/hamburger.xml
new file mode 100644
index 0000000..577bf90
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/hamburger.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/home.xml b/OrangeSale_02/app/src/main/res/drawable/home.xml
new file mode 100644
index 0000000..732d2b3
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/home.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/ic_check.xml b/OrangeSale_02/app/src/main/res/drawable/ic_check.xml
new file mode 100644
index 0000000..0c17df3
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/ic_check.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/drawable/ic_checked.xml b/OrangeSale_02/app/src/main/res/drawable/ic_checked.xml
new file mode 100644
index 0000000..85a4e00
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/ic_checked.xml
@@ -0,0 +1,19 @@
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/drawable/ic_launcher_background.xml b/OrangeSale_02/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/ic_shopping_cart.xml b/OrangeSale_02/app/src/main/res/drawable/ic_shopping_cart.xml
new file mode 100644
index 0000000..c770c0f
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/ic_shopping_cart.xml
@@ -0,0 +1,11 @@
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/drawable/key.xml b/OrangeSale_02/app/src/main/res/drawable/key.xml
new file mode 100644
index 0000000..68ed92e
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/key.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/local_two.xml b/OrangeSale_02/app/src/main/res/drawable/local_two.xml
new file mode 100644
index 0000000..f038231
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/local_two.xml
@@ -0,0 +1,18 @@
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/lock.xml b/OrangeSale_02/app/src/main/res/drawable/lock.xml
new file mode 100644
index 0000000..396f39e
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/lock.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/orange.xml b/OrangeSale_02/app/src/main/res/drawable/orange.xml
new file mode 100644
index 0000000..556bb05
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/orange.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/orange_one.xml b/OrangeSale_02/app/src/main/res/drawable/orange_one.xml
new file mode 100644
index 0000000..7a3352b
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/orange_one.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/peach.xml b/OrangeSale_02/app/src/main/res/drawable/peach.xml
new file mode 100644
index 0000000..79bdae9
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/peach.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/pear.xml b/OrangeSale_02/app/src/main/res/drawable/pear.xml
new file mode 100644
index 0000000..d8bb716
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/pear.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/people.xml b/OrangeSale_02/app/src/main/res/drawable/people.xml
new file mode 100644
index 0000000..14a7cbd
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/people.xml
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/pig.xml b/OrangeSale_02/app/src/main/res/drawable/pig.xml
new file mode 100644
index 0000000..317d29b
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/pig.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/pineapple.xml b/OrangeSale_02/app/src/main/res/drawable/pineapple.xml
new file mode 100644
index 0000000..688f4c8
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/pineapple.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/public_toilet.xml b/OrangeSale_02/app/src/main/res/drawable/public_toilet.xml
new file mode 100644
index 0000000..a78b57c
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/public_toilet.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/pumpkin.xml b/OrangeSale_02/app/src/main/res/drawable/pumpkin.xml
new file mode 100644
index 0000000..cdba4ab
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/pumpkin.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/shopping_cart.xml b/OrangeSale_02/app/src/main/res/drawable/shopping_cart.xml
new file mode 100644
index 0000000..a5aa8fd
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/shopping_cart.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/shrimp.xml b/OrangeSale_02/app/src/main/res/drawable/shrimp.xml
new file mode 100644
index 0000000..b9b8541
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/shrimp.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/tomato.xml b/OrangeSale_02/app/src/main/res/drawable/tomato.xml
new file mode 100644
index 0000000..c051d96
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/tomato.xml
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/turkey.xml b/OrangeSale_02/app/src/main/res/drawable/turkey.xml
new file mode 100644
index 0000000..4897dae
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/turkey.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/user.xml b/OrangeSale_02/app/src/main/res/drawable/user.xml
new file mode 100644
index 0000000..56ea829
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/user.xml
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/drawable/watermelon.xml b/OrangeSale_02/app/src/main/res/drawable/watermelon.xml
new file mode 100644
index 0000000..ed55423
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/drawable/watermelon.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/layout/activity_index.xml b/OrangeSale_02/app/src/main/res/layout/activity_index.xml
new file mode 100644
index 0000000..7ac70cd
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/layout/activity_index.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/layout/activity_main.xml b/OrangeSale_02/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..2a3511f
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/layout/activity_register.xml b/OrangeSale_02/app/src/main/res/layout/activity_register.xml
new file mode 100644
index 0000000..5f243c7
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/layout/activity_register.xml
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/layout/activity_user.xml b/OrangeSale_02/app/src/main/res/layout/activity_user.xml
new file mode 100644
index 0000000..4eb5e73
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/layout/activity_user.xml
@@ -0,0 +1,189 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/layout/bottom_bar_cart.xml b/OrangeSale_02/app/src/main/res/layout/bottom_bar_cart.xml
new file mode 100644
index 0000000..1d21b4c
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/layout/bottom_bar_cart.xml
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/layout/bottom_bar_product.xml b/OrangeSale_02/app/src/main/res/layout/bottom_bar_product.xml
new file mode 100644
index 0000000..aad62bc
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/layout/bottom_bar_product.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/OrangeSale_02/app/src/main/res/layout/bottom_bar_profile.xml b/OrangeSale_02/app/src/main/res/layout/bottom_bar_profile.xml
new file mode 100644
index 0000000..8487520
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/layout/bottom_bar_profile.xml
@@ -0,0 +1,177 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/layout/bottom_bar_shouye.xml b/OrangeSale_02/app/src/main/res/layout/bottom_bar_shouye.xml
new file mode 100644
index 0000000..32d6cef
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/layout/bottom_bar_shouye.xml
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/layout/cartitem_good.xml b/OrangeSale_02/app/src/main/res/layout/cartitem_good.xml
new file mode 100644
index 0000000..43427c4
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/layout/cartitem_good.xml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/layout/cartitem_good_menuview.xml b/OrangeSale_02/app/src/main/res/layout/cartitem_good_menuview.xml
new file mode 100644
index 0000000..a54c2a0
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/layout/cartitem_good_menuview.xml
@@ -0,0 +1,12 @@
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/layout/cartitem_store.xml b/OrangeSale_02/app/src/main/res/layout/cartitem_store.xml
new file mode 100644
index 0000000..4e78a87
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/layout/cartitem_store.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/layout/productitem_left.xml b/OrangeSale_02/app/src/main/res/layout/productitem_left.xml
new file mode 100644
index 0000000..c91578e
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/layout/productitem_left.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/layout/productitem_right.xml b/OrangeSale_02/app/src/main/res/layout/productitem_right.xml
new file mode 100644
index 0000000..187b90e
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/layout/productitem_right.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/layout/shouyeitem_grid_icon.xml b/OrangeSale_02/app/src/main/res/layout/shouyeitem_grid_icon.xml
new file mode 100644
index 0000000..90874dd
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/layout/shouyeitem_grid_icon.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/menu/main_b_nav.xml b/OrangeSale_02/app/src/main/res/menu/main_b_nav.xml
new file mode 100644
index 0000000..46a1a43
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/menu/main_b_nav.xml
@@ -0,0 +1,28 @@
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/OrangeSale_02/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/OrangeSale_02/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/OrangeSale_02/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/OrangeSale_02/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/OrangeSale_02/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/OrangeSale_02/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/OrangeSale_02/app/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 0000000..4f0f1d6
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/OrangeSale_02/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/OrangeSale_02/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..62b611d
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/OrangeSale_02/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/OrangeSale_02/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 0000000..948a307
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/OrangeSale_02/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/OrangeSale_02/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..1b9a695
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/OrangeSale_02/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/OrangeSale_02/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..28d4b77
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/OrangeSale_02/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/OrangeSale_02/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9287f50
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/OrangeSale_02/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/OrangeSale_02/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..aa7d642
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/OrangeSale_02/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/OrangeSale_02/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9126ae3
Binary files /dev/null and b/OrangeSale_02/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/OrangeSale_02/app/src/main/res/values-night/themes.xml b/OrangeSale_02/app/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..255ce36
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/values-night/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/values/arrays.xml b/OrangeSale_02/app/src/main/res/values/arrays.xml
new file mode 100644
index 0000000..6040624
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/values/arrays.xml
@@ -0,0 +1,11 @@
+
+
+
+ - 北京
+ - 上海
+ - 广州
+ - 深圳
+ - 郑州
+ - 成都
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/values/colors.xml b/OrangeSale_02/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..10bf39f
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/values/colors.xml
@@ -0,0 +1,19 @@
+
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+ #F2BB41
+ #F58265
+ #B2B2B2
+ #CCCCCC
+ #C2433A
+ #DF3B0D
+ #3FEE83
+ #aaAA00
+ #97E4F8
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/values/strings.xml b/OrangeSale_02/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..3f535ff
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ OrangeSale_02
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/values/themes.xml b/OrangeSale_02/app/src/main/res/values/themes.xml
new file mode 100644
index 0000000..63ad8be
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/values/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/xml/backup_rules.xml b/OrangeSale_02/app/src/main/res/xml/backup_rules.xml
new file mode 100644
index 0000000..fa0f996
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/xml/backup_rules.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/main/res/xml/data_extraction_rules.xml b/OrangeSale_02/app/src/main/res/xml/data_extraction_rules.xml
new file mode 100644
index 0000000..9ee9997
--- /dev/null
+++ b/OrangeSale_02/app/src/main/res/xml/data_extraction_rules.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OrangeSale_02/app/src/test/java/com/example/orangesale_02/ExampleUnitTest.java b/OrangeSale_02/app/src/test/java/com/example/orangesale_02/ExampleUnitTest.java
new file mode 100644
index 0000000..96a2cdb
--- /dev/null
+++ b/OrangeSale_02/app/src/test/java/com/example/orangesale_02/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.example.orangesale_02;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/OrangeSale_02/build.gradle b/OrangeSale_02/build.gradle
new file mode 100644
index 0000000..9d4048d
--- /dev/null
+++ b/OrangeSale_02/build.gradle
@@ -0,0 +1,5 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+plugins {
+ id 'com.android.application' version '7.3.1' apply false
+ id 'com.android.library' version '7.3.1' apply false
+}
diff --git a/OrangeSale_02/gradle.properties b/OrangeSale_02/gradle.properties
new file mode 100644
index 0000000..dfa3720
--- /dev/null
+++ b/OrangeSale_02/gradle.properties
@@ -0,0 +1,26 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Enables namespacing of each library's R class so that its R class includes only the
+# resources declared in the library itself and none from the library's dependencies,
+# thereby reducing the size of the R class for that library
+android.nonTransitiveRClass=true
+
+# ???? Duplicate class android.support.v4.app.INotificationSideChannel found in modules core-1.7.0-runtime
+android.enableJetifier=true
+android.overridePathCheck=true
+
diff --git a/OrangeSale_02/gradle/wrapper/gradle-wrapper.jar b/OrangeSale_02/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..e708b1c
Binary files /dev/null and b/OrangeSale_02/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/OrangeSale_02/gradle/wrapper/gradle-wrapper.properties b/OrangeSale_02/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..6cfa3cd
--- /dev/null
+++ b/OrangeSale_02/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Dec 28 10:51:23 CST 2022
+distributionBase=GRADLE_USER_HOME
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
+distributionPath=wrapper/dists
+zipStorePath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
diff --git a/OrangeSale_02/gradlew b/OrangeSale_02/gradlew
new file mode 100644
index 0000000..4f906e0
--- /dev/null
+++ b/OrangeSale_02/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/OrangeSale_02/gradlew.bat b/OrangeSale_02/gradlew.bat
new file mode 100644
index 0000000..107acd3
--- /dev/null
+++ b/OrangeSale_02/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/OrangeSale_02/settings.gradle b/OrangeSale_02/settings.gradle
new file mode 100644
index 0000000..2618dc0
--- /dev/null
+++ b/OrangeSale_02/settings.gradle
@@ -0,0 +1,17 @@
+pluginManagement {
+ repositories {
+ gradlePluginPortal()
+ google()
+ mavenCentral()
+ }
+}
+dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+ repositories {
+ google()
+ mavenCentral()
+ maven { url 'https://jitpack.io' }
+ }
+}
+rootProject.name = "OrangeSale_02"
+include ':app'