├── .gitignore ├── .idea ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── gradle.xml ├── misc.xml ├── modules.xml └── runConfigurations.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── qzs │ │ └── android │ │ └── shoppingcart │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── qzs │ │ │ └── android │ │ │ └── shoppingcart │ │ │ └── MainActivity.java │ └── res │ │ ├── drawable │ │ ├── zhongcai_mubanyou.png │ │ └── zhongcai_mubanzuo.png │ │ ├── layout │ │ ├── activity_main.xml │ │ └── item_zhongcai_gridview.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ ├── baisejiantou.png │ │ ├── home_hong.png │ │ ├── ic_launcher.png │ │ ├── moban.png │ │ ├── qiezi.jpg │ │ ├── sign.png │ │ ├── xihongshi.png │ │ ├── zhongcai_iv.png │ │ ├── zhongcai_jia.png │ │ ├── zhongcai_jian.png │ │ ├── zhongcai_mubanyou.png │ │ ├── zhongcai_mubanzuo.png │ │ ├── zhongcai_taitou.png │ │ └── zhongzhi.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── raw │ │ ├── gouwuchegif.gif │ │ └── qzs1.jpg │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── qzs │ └── android │ └── shoppingcart │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | 47 | 48 | 49 | 50 | 1.8 51 | 52 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ShoppingCart 2 | Android实现购物车页面及购物车效果(点击动画) 3 | 4 | 效果图如下:
5 | 6 | ![alt text](https://github.com/javaexception/ShoppingCart/blob/master/app/src/main/res/raw/gouwuchegif.gif)
7 | 8 | 思路:
9 | (1)思考每个条目中的数字的更新原理。
10 | (2)购物车的动画效果。
11 | (3)购物清单怎么显示(这个我暂时没有写,如果需要的话,可以在我的简书下给我留言)。
12 | 13 | 1.因为进入页面,所有的商品个数都显示为零,所以我用 ArrayList> data,把商品集合都附上零:
14 | ``` 15 | //下面把data都添加0,为了刚开始显示时,显示的是0 16 | for (int i = 0; i < list.size(); i++) { 17 | HashMap myhashmap = new HashMap(); 18 | myhashmap.put("number", "" + 0); 19 | data.add(myhashmap); 20 | } 21 | ``` 22 | 然后把data传入Adapter:
23 | ``` 24 | adapter = new MyAdapter(data); 25 | ``` 26 | 当我们对商品进行增减时,我们可以通过hashmap来更改,如下是增加商品的部分代码:
27 | ``` 28 | b = Integer.parseInt((String) data.get(position).get( 29 | "number")); 30 | data.get(position).put("number", "" + (b + 1)); 31 | ``` 32 | 33 | 2.购物车动画效果:
34 | 首先获取点击时的XY坐标,并且设置动画图片:
35 | 36 | ``` 37 | // ball是个imageview 38 | startLocation = new int[2];// 一个整型数组,用来存储按钮的在屏幕的X、Y坐标 39 | view.getLocationInWindow(startLocation);// 这是获取购买按钮的在屏幕的X、Y坐标(这也是动画开始的坐标) 40 | ball = new ImageView(MainActivity.this); 41 | ball.setImageResource(R.mipmap.sign);// 设置动画的图片我的是一个小球(R.mipmap.sign) 42 | ``` 43 | 然后是开始执行动画:
44 | 45 | ``` 46 | private void setAnim(final View v, int[] startLocation) { 47 | anim_mask_layout = null; 48 | anim_mask_layout = createAnimLayout(); //创建动画层 49 | anim_mask_layout.addView(v);//把动画小球添加到动画层 50 | final View view = addViewToAnimLayout(anim_mask_layout, v, 51 | startLocation); 52 | int[] endLocation = new int[2];// 存储动画结束位置的X、Y坐标 53 | re_zhongcai_tanchu.getLocationInWindow(endLocation);// re_zhongcai_tanchu是那个抛物线最后掉落的控件 54 | 55 | // 计算位移 56 | int endX = 0 - startLocation[0] + 40;// 动画位移的X坐标 57 | int endY = endLocation[1] - startLocation[1];// 动画位移的y坐标 58 | TranslateAnimation translateAnimationX = new TranslateAnimation(0, 59 | endX, 0, 0); 60 | translateAnimationX.setInterpolator(new LinearInterpolator()); 61 | translateAnimationX.setRepeatCount(0);// 动画重复执行的次数 62 | translateAnimationX.setFillAfter(true); 63 | 64 | TranslateAnimation translateAnimationY = new TranslateAnimation(0, 0, 65 | 0, endY); 66 | translateAnimationY.setInterpolator(new AccelerateInterpolator()); 67 | translateAnimationY.setRepeatCount(0);// 动画重复执行的次数 68 | translateAnimationX.setFillAfter(true); 69 | 70 | final AnimationSet set = new AnimationSet(false); 71 | set.setFillAfter(false); 72 | set.addAnimation(translateAnimationY); 73 | set.addAnimation(translateAnimationX); 74 | set.setDuration(800);// 动画的执行时间 75 | view.startAnimation(set); 76 | // 动画监听事件 77 | set.setAnimationListener(new Animation.AnimationListener() { 78 | // 动画的开始 79 | @Override 80 | public void onAnimationStart(Animation animation) { 81 | v.setVisibility(View.VISIBLE); 82 | // Log.e("动画","asdasdasdasd"); 83 | } 84 | 85 | @Override 86 | public void onAnimationRepeat(Animation animation) { 87 | // TODO Auto-generated method stub 88 | } 89 | 90 | // 动画的结束 91 | @Override 92 | public void onAnimationEnd(Animation animation) { 93 | v.setVisibility(View.GONE); 94 | set.cancel(); 95 | animation.cancel(); 96 | } 97 | }); 98 | 99 | } 100 | 101 | ``` 102 | 需要注意的是,当动画结束必须关闭动画:
103 | 104 | ``` 105 | v.setVisibility(View.GONE); 106 | set.cancel(); 107 | animation.cancel(); 108 | ``` 109 | 110 | 3. 购物车的弹出清单功能,我没有写,需要的话,可以去我的简书留言.
111 | 112 | [我的简书地址](http://www.jianshu.com/u/2a55d6e39135) 113 | 114 | 我的公众号如下:
115 | 116 | ![alt text]( https://github.com/javaexception/ShoppingCart/blob/master/app/src/main/res/raw/qzs1.jpg)
117 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "24.0.3" 6 | defaultConfig { 7 | applicationId "com.qzs.android.shoppingcart" 8 | minSdkVersion 15 9 | targetSdkVersion 25 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 25 | exclude group: 'com.android.support', module: 'support-annotations' 26 | }) 27 | compile 'com.android.support:appcompat-v7:25.3.1' 28 | testCompile 'junit:junit:4.12' 29 | 30 | } 31 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in C:\Users\Administrator\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/qzs/android/shoppingcart/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.qzs.android.shoppingcart; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.qzs.android.shoppingcart", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/qzs/android/shoppingcart/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.qzs.android.shoppingcart; 2 | 3 | import android.os.Handler; 4 | import android.os.Message; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.os.Bundle; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.view.animation.AccelerateInterpolator; 10 | import android.view.animation.Animation; 11 | import android.view.animation.AnimationSet; 12 | import android.view.animation.LinearInterpolator; 13 | import android.view.animation.TranslateAnimation; 14 | import android.widget.BaseAdapter; 15 | import android.widget.GridView; 16 | import android.widget.ImageView; 17 | import android.widget.LinearLayout; 18 | import android.widget.RelativeLayout; 19 | import android.widget.TextView; 20 | import android.widget.Toast; 21 | 22 | 23 | import java.util.ArrayList; 24 | import java.util.HashMap; 25 | import java.util.List; 26 | 27 | public class MainActivity extends AppCompatActivity { 28 | private Handler handler=new Handler(){ 29 | @Override 30 | public void handleMessage(Message msg) { 31 | switch (msg.what){ 32 | case 0: 33 | setAnim(ball, startLocation);// 开始执行动画 34 | break; 35 | } 36 | } 37 | }; 38 | private GridView gridview_zc; 39 | private List list=new ArrayList<>(); 40 | ArrayList> data =new ArrayList<>(); 41 | private MyAdapter adapter; 42 | 43 | private TextView tv_zhongcai_hong; 44 | public int hongitemjia; 45 | public int hongitemjian; 46 | 47 | //dong动画: 48 | private int[] startLocation; 49 | private ImageView ball;// 小圆点 50 | private ViewGroup anim_mask_layout;//动画层 51 | private RelativeLayout re_zhongcai_tanchu; 52 | 53 | @Override 54 | protected void onCreate(Bundle savedInstanceState) { 55 | super.onCreate(savedInstanceState); 56 | setContentView(R.layout.activity_main); 57 | initView(); 58 | initList(); 59 | 60 | } 61 | 62 | private void initList() { 63 | list.add("商品1"); 64 | list.add("商品2"); 65 | list.add("商品3"); 66 | list.add("商品4"); 67 | list.add("商品5"); 68 | list.add("商品6"); 69 | list.add("商品7"); 70 | list.add("商品8"); 71 | list.add("商品9"); 72 | list.add("商品10"); 73 | //下面把data都添加0,为了刚开始显示时,显示的是0 74 | for (int i = 0; i < list.size(); i++) { 75 | HashMap myhashmap = new HashMap(); 76 | myhashmap.put("number", "" + 0); 77 | data.add(myhashmap); 78 | } 79 | adapter = new MyAdapter(data); 80 | adapter.notifyDataSetChanged(); 81 | gridview_zc.setAdapter(adapter); 82 | } 83 | 84 | private void initView() { 85 | gridview_zc= (GridView) findViewById(R.id.gridview_zc); 86 | tv_zhongcai_hong= (TextView) findViewById(R.id.tv_zhongcai_hong); 87 | re_zhongcai_tanchu= (RelativeLayout) findViewById(R.id.re_zhongcai_tanchu); 88 | } 89 | 90 | 91 | class MyAdapter extends BaseAdapter{ 92 | int a; 93 | int b; 94 | private ArrayList> data; 95 | private ViewHolder viewholder; 96 | 97 | public MyAdapter(ArrayList> data) { 98 | this.data = data; 99 | 100 | } 101 | 102 | @Override 103 | public int getCount() { 104 | return list.size(); 105 | } 106 | 107 | @Override 108 | public Object getItem(int i) { 109 | return list.get(i); 110 | } 111 | 112 | @Override 113 | public long getItemId(int i) { 114 | return i; 115 | } 116 | 117 | @Override 118 | public View getView(final int position, View convertView, ViewGroup viewGroup) { 119 | if (convertView==null){ 120 | viewholder = new ViewHolder(); 121 | convertView = View.inflate(getApplicationContext(), 122 | R.layout.item_zhongcai_gridview, null); 123 | viewholder.addbt = (TextView) convertView 124 | .findViewById(R.id.addbt); 125 | viewholder.item_iv_muban= (ImageView) convertView.findViewById(R.id.item_iv_muban); 126 | viewholder.subbt = (TextView) convertView 127 | .findViewById(R.id.subbt); 128 | viewholder.tv_shuzi = (TextView) convertView 129 | .findViewById(R.id.tv_shuzi); 130 | viewholder.tv_show = (TextView) convertView 131 | .findViewById(R.id.tv_show); 132 | convertView.setTag(viewholder); 133 | }else { 134 | viewholder = (ViewHolder) convertView.getTag(); 135 | } 136 | if (position%2==0){ 137 | viewholder.item_iv_muban.setImageResource(R.mipmap.zhongcai_mubanzuo); 138 | }else { 139 | viewholder.item_iv_muban.setImageResource(R.mipmap.zhongcai_mubanyou); 140 | } 141 | viewholder.tv_shuzi.setText(data.get(position).get("number") + ""); 142 | viewholder.tv_show.setText(list.get(position)); 143 | int x=0; 144 | for(int i=0;i 0) { 158 | data.get(position).put("number", "" + (a - 1)); 159 | if (hongitemjian == 0) { 160 | tv_zhongcai_hong.setVisibility(View.INVISIBLE); 161 | }else{ 162 | tv_zhongcai_hong.setVisibility(View.VISIBLE); 163 | } 164 | tv_zhongcai_hong.setText(hongitemjian + ""); 165 | 166 | }else if (a == 0) { 167 | tv_zhongcai_hong.setVisibility(View.INVISIBLE); 168 | viewholder.subbt.setClickable(false); 169 | } else { 170 | Toast.makeText(getApplicationContext(),"不能为负数", Toast.LENGTH_SHORT).show(); 171 | 172 | } 173 | notifyDataSetChanged(); 174 | } 175 | }); 176 | viewholder.addbt.setOnClickListener(new View.OnClickListener() { 177 | @Override 178 | public void onClick(View view) { 179 | startLocation = new int[2];// 一个整型数组,用来存储按钮的在屏幕的X、Y坐标 180 | view.getLocationInWindow(startLocation);// 这是获取购买按钮的在屏幕的X、Y坐标(这也是动画开始的坐标) 181 | ball = new ImageView(MainActivity.this);// buyImg是动画的图片,我的是一个小球(R.drawable.sign) 182 | ball.setImageResource(R.mipmap.sign);// 设置buyImg的图片 183 | new Thread(new Runnable() { 184 | @Override 185 | public void run() { 186 | handler.sendEmptyMessage(0); 187 | } 188 | }).start(); 189 | b = Integer.parseInt((String) data.get(position).get( 190 | "number")); 191 | data.get(position).put("number", "" + (b + 1)); 192 | if (hongitemjia==0){ 193 | tv_zhongcai_hong.setVisibility(View.INVISIBLE); 194 | }else{ 195 | tv_zhongcai_hong.setVisibility(View.VISIBLE); 196 | } 197 | tv_zhongcai_hong.setText(hongitemjia+""); 198 | adapter.notifyDataSetChanged(); 199 | } 200 | }); 201 | 202 | 203 | 204 | return convertView; 205 | } 206 | } 207 | public class ViewHolder { 208 | TextView tv_show; 209 | TextView subbt; 210 | TextView tv_shuzi; 211 | TextView addbt; 212 | ImageView item_iv_muban; 213 | } 214 | 215 | 216 | 217 | 218 | private void setAnim(final View v, int[] startLocation) { 219 | anim_mask_layout = null; 220 | anim_mask_layout = createAnimLayout(); 221 | anim_mask_layout.addView(v);//把动画小球添加到动画层 222 | final View view = addViewToAnimLayout(anim_mask_layout, v, 223 | startLocation); 224 | int[] endLocation = new int[2];// 存储动画结束位置的X、Y坐标 225 | re_zhongcai_tanchu.getLocationInWindow(endLocation);// re_zhongcai_tanchu是那个抛物线最后掉落的控件 226 | 227 | // 计算位移 228 | int endX = 0 - startLocation[0] + 40;// 动画位移的X坐标 229 | int endY = endLocation[1] - startLocation[1];// 动画位移的y坐标 230 | TranslateAnimation translateAnimationX = new TranslateAnimation(0, 231 | endX, 0, 0); 232 | translateAnimationX.setInterpolator(new LinearInterpolator()); 233 | translateAnimationX.setRepeatCount(0);// 动画重复执行的次数 234 | translateAnimationX.setFillAfter(true); 235 | 236 | TranslateAnimation translateAnimationY = new TranslateAnimation(0, 0, 237 | 0, endY); 238 | translateAnimationY.setInterpolator(new AccelerateInterpolator()); 239 | translateAnimationY.setRepeatCount(0);// 动画重复执行的次数 240 | translateAnimationX.setFillAfter(true); 241 | 242 | final AnimationSet set = new AnimationSet(false); 243 | set.setFillAfter(false); 244 | set.addAnimation(translateAnimationY); 245 | set.addAnimation(translateAnimationX); 246 | set.setDuration(800);// 动画的执行时间 247 | view.startAnimation(set); 248 | // 动画监听事件 249 | set.setAnimationListener(new Animation.AnimationListener() { 250 | // 动画的开始 251 | @Override 252 | public void onAnimationStart(Animation animation) { 253 | v.setVisibility(View.VISIBLE); 254 | // Log.e("动画","asdasdasdasd"); 255 | } 256 | 257 | @Override 258 | public void onAnimationRepeat(Animation animation) { 259 | // TODO Auto-generated method stub 260 | } 261 | 262 | // 动画的结束 263 | @Override 264 | public void onAnimationEnd(Animation animation) { 265 | v.setVisibility(View.GONE); 266 | set.cancel(); 267 | animation.cancel(); 268 | } 269 | }); 270 | 271 | } 272 | 273 | /** 274 | * @Description: 创建动画层 275 | * @param 276 | * @return void 277 | * @throws 278 | */ 279 | private ViewGroup createAnimLayout() { 280 | ViewGroup rootView = (ViewGroup) this.getWindow().getDecorView(); 281 | LinearLayout animLayout = new LinearLayout(this); 282 | LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( 283 | LinearLayout.LayoutParams.MATCH_PARENT, 284 | LinearLayout.LayoutParams.MATCH_PARENT); 285 | animLayout.setLayoutParams(lp); 286 | animLayout.setId(Integer.MAX_VALUE); 287 | animLayout.setBackgroundResource(android.R.color.transparent); 288 | rootView.addView(animLayout); 289 | return animLayout; 290 | } 291 | 292 | private View addViewToAnimLayout(final ViewGroup parent, final View view, 293 | int[] location) { 294 | int x = location[0]; 295 | int y = location[1]; 296 | LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( 297 | LinearLayout.LayoutParams.WRAP_CONTENT, 298 | LinearLayout.LayoutParams.WRAP_CONTENT); 299 | lp.leftMargin = x; 300 | lp.topMargin = y; 301 | view.setLayoutParams(lp); 302 | return view; 303 | } 304 | } 305 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/zhongcai_mubanyou.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/drawable/zhongcai_mubanyou.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/zhongcai_mubanzuo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/drawable/zhongcai_mubanzuo.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 15 | 19 | 25 | 26 | 35 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 70 | 75 | 80 | 91 | 92 | 96 | 97 | 104 | 105 | 106 | 107 | 108 | 109 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_zhongcai_gridview.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 9 | 13 | 14 | 20 | 26 | 27 | 34 | 35 | 41 | 42 | 50 | 51 | 52 | 58 | 59 | 60 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/baisejiantou.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/mipmap-xhdpi/baisejiantou.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/home_hong.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/mipmap-xhdpi/home_hong.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/moban.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/mipmap-xhdpi/moban.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/qiezi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/mipmap-xhdpi/qiezi.jpg -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/sign.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/mipmap-xhdpi/sign.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/xihongshi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/mipmap-xhdpi/xihongshi.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/zhongcai_iv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/mipmap-xhdpi/zhongcai_iv.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/zhongcai_jia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/mipmap-xhdpi/zhongcai_jia.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/zhongcai_jian.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/mipmap-xhdpi/zhongcai_jian.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/zhongcai_mubanyou.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/mipmap-xhdpi/zhongcai_mubanyou.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/zhongcai_mubanzuo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/mipmap-xhdpi/zhongcai_mubanzuo.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/zhongcai_taitou.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/mipmap-xhdpi/zhongcai_taitou.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/zhongzhi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/mipmap-xhdpi/zhongzhi.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/raw/gouwuchegif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/raw/gouwuchegif.gif -------------------------------------------------------------------------------- /app/src/main/res/raw/qzs1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/app/src/main/res/raw/qzs1.jpg -------------------------------------------------------------------------------- /app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | ShoppingCart 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/test/java/com/qzs/android/shoppingcart/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.qzs.android.shoppingcart; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:2.2.0' 9 | 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | jcenter() 18 | } 19 | } 20 | 21 | task clean(type: Delete) { 22 | delete rootProject.buildDir 23 | } 24 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | org.gradle.jvmargs=-Xmx1536m 13 | 14 | # When configured, Gradle will run in incubating parallel mode. 15 | # This option should only be used with decoupled projects. More details, visit 16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 17 | # org.gradle.parallel=true 18 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javaexception/ShoppingCart/18f7cae74641fad17163b8b213cf1f6787279f4d/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Dec 28 10:00:20 PST 2015 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # Attempt to set APP_HOME 46 | # Resolve links: $0 may be a link 47 | PRG="$0" 48 | # Need this for relative symlinks. 49 | while [ -h "$PRG" ] ; do 50 | ls=`ls -ld "$PRG"` 51 | link=`expr "$ls" : '.*-> \(.*\)$'` 52 | if expr "$link" : '/.*' > /dev/null; then 53 | PRG="$link" 54 | else 55 | PRG=`dirname "$PRG"`"/$link" 56 | fi 57 | done 58 | SAVED="`pwd`" 59 | cd "`dirname \"$PRG\"`/" >/dev/null 60 | APP_HOME="`pwd -P`" 61 | cd "$SAVED" >/dev/null 62 | 63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 64 | 65 | # Determine the Java command to use to start the JVM. 66 | if [ -n "$JAVA_HOME" ] ; then 67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 68 | # IBM's JDK on AIX uses strange locations for the executables 69 | JAVACMD="$JAVA_HOME/jre/sh/java" 70 | else 71 | JAVACMD="$JAVA_HOME/bin/java" 72 | fi 73 | if [ ! -x "$JAVACMD" ] ; then 74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 75 | 76 | Please set the JAVA_HOME variable in your environment to match the 77 | location of your Java installation." 78 | fi 79 | else 80 | JAVACMD="java" 81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | 87 | # Increase the maximum file descriptors if we can. 88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 89 | MAX_FD_LIMIT=`ulimit -H -n` 90 | if [ $? -eq 0 ] ; then 91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 92 | MAX_FD="$MAX_FD_LIMIT" 93 | fi 94 | ulimit -n $MAX_FD 95 | if [ $? -ne 0 ] ; then 96 | warn "Could not set maximum file descriptor limit: $MAX_FD" 97 | fi 98 | else 99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 100 | fi 101 | fi 102 | 103 | # For Darwin, add options to specify how the application appears in the dock 104 | if $darwin; then 105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 106 | fi 107 | 108 | # For Cygwin, switch paths to Windows format before running java 109 | if $cygwin ; then 110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 112 | JAVACMD=`cygpath --unix "$JAVACMD"` 113 | 114 | # We build the pattern for arguments to be converted via cygpath 115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 116 | SEP="" 117 | for dir in $ROOTDIRSRAW ; do 118 | ROOTDIRS="$ROOTDIRS$SEP$dir" 119 | SEP="|" 120 | done 121 | OURCYGPATTERN="(^($ROOTDIRS))" 122 | # Add a user-defined pattern to the cygpath arguments 123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 125 | fi 126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 127 | i=0 128 | for arg in "$@" ; do 129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 131 | 132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 134 | else 135 | eval `echo args$i`="\"$arg\"" 136 | fi 137 | i=$((i+1)) 138 | done 139 | case $i in 140 | (0) set -- ;; 141 | (1) set -- "$args0" ;; 142 | (2) set -- "$args0" "$args1" ;; 143 | (3) set -- "$args0" "$args1" "$args2" ;; 144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 150 | esac 151 | fi 152 | 153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 154 | function splitJvmOpts() { 155 | JVM_OPTS=("$@") 156 | } 157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 159 | 160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 161 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | --------------------------------------------------------------------------------