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 @@ + + + + + + + + + + + + + + + + +