Android 开发笔记___实战项目:购物车

  购物车的应用很广泛,电商app基本上都有它的身影。由于它用到了多种存储方式,通过项目对数据的存储有更高层次的了解。

 

1.设计思路

  首先看看购物车的外观。第一次进入时里面是空的,去购物页面加入购物车以后,返回到购物车才能看到商品列表。

      • 商品图表
      • 名称
      • 数量
      • 单价
      • 总价

  一般购物车图标出现在几乎所有的页面,或者某一个角落。

  一旦有新的商品加入购物车,购物车图标上的商品数量就加一。

  任何页面点击购物车图标直接进入购物车页面

  

  用到的存储方式:

    • 数据库SQLite:是最直观的数据库,购物车里的商品列表一定放在SQLite中,增删改查都少不了它。
    • 共享参数sharedpreferences:不同页面上的购物车图标都有数字,表示商品数量。因为每个页面都要显示,如果用sqlite每次都要查询的话,就会很费资源。又因为商品数量需要持久存储,所以也不合适放在全局内存,不然下次启动就会清空。
    • SD卡文件:通常电商app的图标都来自服务器端,又因为图片下载很耗流量,因此一次加载后面从SD卡中读取之前加载的内容,加载又快又不耗流量,一举两得。
    • 全局内存:上面说了,访问SD卡果然是个好主意,然而商品频道、购物车频道等可能在一个页面显示多张商品小图,如果每张小图都访问依次SD卡,频繁的SD卡访问读写是很耗资源的。更好的办法是把商品小图加载进全局内存,这样直接从内存中获取图片,高效又快速。之所以不把商品大图放入全局内存,是因为大图很耗空间,一不小心就会占用几十兆内存。

2.小知识

  菜单Menu

    1. 选项菜单------optionMenu

        通过按菜单键或点击事件触发

      2.上下文菜单----contextMenu

        通过长按事件触发

    都有对应的菜单布局文件,放在res/menu目录下。

  

  1.选项菜单------optionMenu

    弹出选项菜单的途径有3种:

      (1)按菜单键

      (2)在代码中手动打开,即调用openOptionMenu方法

      (3)按工具栏右侧的溢出菜单按钮

       需要重写两种方法:

      • onCreateOptionMenu:在页面打开时调用,需要指定菜单列表的XML文件。
      • onOptionItemSelected:在列表的菜单项被选中时调用,需要对不同的菜单项做分支处理
    •  1 <menu xmlns:android="http://schemas.android.com/apk/res/android" >
       2 
       3     <item
       4         android:id="@+id/menu_change_time"
       5         android:orderInCategory="1"
       6         android:title="改变时间"/>
       7 
       8     <item
       9         android:id="@+id/menu_change_color"
      10         android:orderInCategory="8"
      11         android:title="改变颜色"/>
      12     
      13     <item
      14         android:id="@+id/menu_change_bg"
      15         android:orderInCategory="9"
      16         android:title="改变背景"/>
      17     
      18 </menu>

       

    •  1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       2     android:layout_width="match_parent"
       3     android:layout_height="match_parent"
       4     android:focusable="true"
       5     android:focusableInTouchMode="true"
       6     android:orientation="vertical"
       7     android:padding="10dp" >
       8 
       9     <Button
      10         android:id="@+id/btn_option"
      11         android:layout_width="match_parent"
      12         android:layout_height="wrap_content"
      13         android:text="打开选项菜单,也可直接按菜单键"
      14         android:textColor="@color/black"
      15         android:textSize="17sp" />
      16     
      17     <TextView
      18         android:id="@+id/tv_option"
      19         android:layout_width="match_parent"
      20         android:layout_height="50dp"
      21         android:gravity="left|center"
      22         android:textColor="@color/black"
      23         android:textSize="17sp" />
      24 
      25 </LinearLayout>
       1 package com.example.alimjan.hello_world;
       2 
       3 /**
       4  * Created by alimjan on 7/13/2017.
       5  */
       6 
       7         import com.example.alimjan.hello_world.Utils.DateUtil;
       8         import android.app.Activity;
       9         import android.content.Context;
      10         import android.content.Intent;
      11         import android.graphics.Color;
      12         import android.os.Bundle;
      13         import android.support.v7.app.AppCompatActivity;
      14         import android.util.Log;
      15         import android.view.Menu;
      16         import android.view.MenuItem;
      17         import android.view.View;
      18         import android.view.View.OnClickListener;
      19         import android.widget.TextView;
      20 
      21 public class class_4_5_2_1 extends Activity implements OnClickListener {
      22 
      23     private static final String TAG = "MenuOptionActivity";
      24     private TextView tv_option;
      25 
      26     @Override
      27     protected void onCreate(Bundle savedInstanceState) {
      28         super.onCreate(savedInstanceState);
      29         setContentView(R.layout.code_4_5_2_1);
      30         tv_option = (TextView) findViewById(R.id.tv_option);
      31         findViewById(R.id.btn_option).setOnClickListener(this);
      32 
      33         setRandomTime();
      34     }
      35 
      36     @Override
      37     public void onClick(View v) {
      38         if (v.getId() == R.id.btn_option) {
      39             //注意:如果当前页面继承自AppCompatActivity,并且appcompat版本不低于22.1.0
      40             //那么调用openOptionsMenu方法将不会弹出菜单。这应该是Android的一个bug
      41             openOptionsMenu();
      42         }
      43     }
      44 
      45     @Override
      46     public boolean onCreateOptionsMenu(Menu menu) {
      47         getMenuInflater().inflate(R.menu.menu_option, menu);
      48         return true;
      49     }
      50 
      51     @Override
      52     public boolean onOptionsItemSelected(MenuItem item) {
      53         int id = item.getItemId();
      54         if (id == R.id.menu_change_time) {
      55             setRandomTime();
      56         } else if (id == R.id.menu_change_color) {
      57             tv_option.setTextColor(getRandomColor());
      58         } else if (id == R.id.menu_change_bg) {
      59             tv_option.setBackgroundColor(getRandomColor());
      60         }
      61         return true;
      62     }
      63 
      64     private void setRandomTime() {
      65         String desc = DateUtil.getCurDateStr("yyyy-MM-dd HH:mm:ss") + " 这里是菜单显示文本";
      66         tv_option.setText(desc);
      67     }
      68 
      69     private int[] mColorArray = {
      70             Color.BLACK, Color.WHITE, Color.RED, Color.YELLOW, Color.GREEN,
      71             Color.BLUE, Color.CYAN, Color.MAGENTA, Color.GRAY, Color.DKGRAY
      72     };
      73     private int getRandomColor() {
      74         int random = (int) (Math.random()*10 % 10);
      75         return mColorArray[random];
      76     }
      77     public static void startHome(Context mContext) {
      78         Intent intent = new Intent(mContext, class_4_5_2_1.class);
      79         mContext.startActivity(intent);
      80     }
      81 
      82 }

       

  2.上下文菜单----ContextMenu

    弹出上下文菜单的途径有两种:

      (1)默认在某个控件长按时弹出。

         通常在onStart方法中加入registerForContextMenu方法为指定控件注册上下文菜单,在onStop函数中加入unregisterForContextMenu方法为指定控件注销上下文                                    菜单

      (2)在长按事件之外的其他时间中打开上下文菜单,先执行registerForContextMenu方法注册菜单,然后执行openContextMenu方法打开菜单,最后执行                                      unregisterForContextMenu方法注销菜单。

    需要重写以下两种方法:

      • onCreateContextMenu:在此指定菜单列表的XML文件,作为上下文菜单列表项的来源。
      • onContextItemSelected:在此对不同的菜单项做分支处理。
    •  1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       2     android:layout_width="match_parent"
       3     android:layout_height="match_parent"
       4     android:focusable="true"
       5     android:focusableInTouchMode="true"
       6     android:orientation="vertical"
       7     android:padding="10dp" >
       8 
       9     <Button
      10         android:id="@+id/btn_context"
      11         android:layout_width="match_parent"
      12         android:layout_height="wrap_content"
      13         android:text="打开上下文菜单,长按下面文本亦可"
      14         android:textColor="@color/black"
      15         android:textSize="17sp" />
      16 
      17     <TextView
      18         android:id="@+id/tv_context"
      19         android:layout_width="match_parent"
      20         android:layout_height="50dp"
      21         android:gravity="left|center"
      22         android:textColor="@color/black"
      23         android:textSize="17sp" />
      24 
      25 </LinearLayout>
       1 package com.example.alimjan.hello_world;
       2 
       3 /**
       4  * Created by alimjan on 7/13/2017.
       5  */
       6         import com.example.alimjan.hello_world.Utils.DateUtil;
       7 
       8         import android.content.Context;
       9         import android.content.Intent;
      10         import android.graphics.Color;
      11         import android.os.Bundle;
      12         import android.support.v7.app.AppCompatActivity;
      13         import android.view.ContextMenu;
      14         import android.view.ContextMenu.ContextMenuInfo;
      15         import android.view.View.OnClickListener;
      16         import android.view.MenuItem;
      17         import android.view.View;
      18         import android.view.Window;
      19         import android.widget.TextView;
      20 
      21 public class class_4_5_2_2 extends AppCompatActivity implements OnClickListener {
      22 
      23     private TextView tv_context;
      24 
      25     @Override
      26     protected void onCreate(Bundle savedInstanceState) {
      27         super.onCreate(savedInstanceState);
      28         setContentView(R.layout.code_4_5_2_2);
      29         tv_context = (TextView) findViewById(R.id.tv_context);
      30         findViewById(R.id.btn_context).setOnClickListener(this);
      31 
      32         setRandomTime();
      33     }
      34 
      35     @Override
      36     public void onClick(View v) {
      37         if (v.getId() == R.id.btn_context) {
      38             registerForContextMenu(v);
      39             openContextMenu(v);
      40             unregisterForContextMenu(v);
      41         }
      42     }
      43 
      44     @Override
      45     protected void onResume() {
      46         registerForContextMenu(tv_context);
      47         super.onResume();
      48     }
      49 
      50     @Override
      51     protected void onPause() {
      52         unregisterForContextMenu(tv_context);
      53         super.onPause();
      54     }
      55 
      56     @Override
      57     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
      58         getMenuInflater().inflate(R.menu.menu_option, menu);
      59     }
      60 
      61     @Override
      62     public boolean onContextItemSelected(MenuItem item) {
      63         int id = item.getItemId();
      64         if (id == R.id.menu_change_time) {
      65             setRandomTime();
      66         } else if (id == R.id.menu_change_color) {
      67             tv_context.setTextColor(getRandomColor());
      68         } else if (id == R.id.menu_change_bg) {
      69             tv_context.setBackgroundColor(getRandomColor());
      70         }
      71         return true;
      72     }
      73 
      74     private void setRandomTime() {
      75         String desc = DateUtil.getCurDateStr("yyyy-MM-dd HH:mm:ss") + " 这里是菜单显示文本";
      76         tv_context.setText(desc);
      77     }
      78 
      79     private int[] mColorArray = {
      80             Color.BLACK, Color.WHITE, Color.RED, Color.YELLOW, Color.GREEN,
      81             Color.BLUE, Color.CYAN, Color.MAGENTA, Color.GRAY, Color.DKGRAY
      82     };
      83     private int getRandomColor() {
      84         int random = (int) (Math.random()*10 % 10);
      85         return mColorArray[random];
      86     }
      87     public static void startHome(Context mContext) {
      88         Intent intent = new Intent(mContext, class_4_5_2_2.class);
      89         mContext.startActivity(intent);
      90     }
      91 
      92 }

      上下文菜单的菜单列表固定显示在页面中部,菜单外的其他区域颜色会变深。

3.开始敲代码

  步骤①  想好代码文件与布局文件的名称。(这里因为放到自己的笔记本上,文件名按照序号来起。)

     步骤②  在AndroidManiFest.xml文件中补充相应的配置。

     步骤③    敲业务逻辑以及布局文件的代码。

  

  下面贴代码:

shoppingcatractivity.java:

  1 package com.example.alimjan.hello_world;
  2 
  3 import android.app.Activity;
  4 import android.app.AlertDialog;
  5 import android.content.Context;
  6 import android.content.Intent;
  7 import android.graphics.Bitmap;
  8 import android.graphics.BitmapFactory;
  9 import android.graphics.Color;
 10 import android.os.Bundle;
 11 import android.os.Environment;
 12 import android.util.Log;
 13 import android.util.TypedValue;
 14 import android.view.ContextMenu;
 15 import android.view.ContextMenu.ContextMenuInfo;
 16 import android.view.Gravity;
 17 import android.view.Menu;
 18 import android.view.MenuItem;
 19 import android.view.View;
 20 import android.view.View.OnClickListener;
 21 import android.view.ViewGroup.LayoutParams;
 22 import android.view.Window;
 23 import android.widget.ImageView;
 24 import android.widget.ImageView.ScaleType;
 25 import android.widget.LinearLayout;
 26 import android.widget.TextView;
 27 import android.widget.Toast;
 28 
 29 import com.example.alimjan.hello_world.Utils.FileUtil;
 30 import com.example.alimjan.hello_world.bean.CartInfo;
 31 import com.example.alimjan.hello_world.bean.GoodsInfo;
 32 import com.example.alimjan.hello_world.dataBase.CartDBHelper;
 33 import com.example.alimjan.hello_world.dataBase.GoodsDBHelper;
 34 import com.example.alimjan.hello_world.Utils.DateUtil;
 35 import com.example.alimjan.hello_world.Utils.SharedUtil;
 36 
 37 import java.util.ArrayList;
 38 import java.util.HashMap;
 39 
 40 /**
 41  * Created by alimjan on 2017/07/13.
 42  */
 43 public class ShoppingCartActivity extends Activity implements OnClickListener {
 44 
 45     private final static String TAG = "ShoppingCartActivity";
 46     private ImageView iv_menu;
 47     private TextView tv_title;
 48     private TextView tv_count;
 49     private TextView tv_total_price;
 50     private LinearLayout ll_content;
 51     private LinearLayout ll_cart;
 52     private LinearLayout ll_empty;
 53     private int mCount;
 54     
 55     @Override
 56     protected void onCreate(Bundle savedInstanceState) {
 57         super.onCreate(savedInstanceState);
 58         requestWindowFeature(Window.FEATURE_NO_TITLE);
 59         setContentView(R.layout.activity_shopping_cart);
 60         iv_menu = (ImageView) findViewById(R.id.iv_menu);
 61         tv_title = (TextView) findViewById(R.id.tv_title);
 62         tv_count = (TextView) findViewById(R.id.tv_count);
 63         tv_total_price = (TextView) findViewById(R.id.tv_total_price);
 64         ll_content = (LinearLayout) findViewById(R.id.ll_content);
 65         ll_cart = (LinearLayout) findViewById(R.id.ll_cart);
 66         ll_empty = (LinearLayout) findViewById(R.id.ll_empty);
 67         
 68         iv_menu.setOnClickListener(this);
 69         findViewById(R.id.btn_shopping_channel).setOnClickListener(this);
 70         findViewById(R.id.btn_settle).setOnClickListener(this);
 71         iv_menu.setVisibility(View.VISIBLE);
 72         tv_title.setText("购物车");
 73     }
 74     
 75     //显示购物车图标中的商品数量
 76     private void showCount(int count) {
 77         mCount = count;
 78         tv_count.setText(""+mCount);
 79         if (mCount == 0) {
 80             ll_content.setVisibility(View.GONE);
 81             ll_cart.removeAllViews();
 82             ll_empty.setVisibility(View.VISIBLE);
 83         } else {
 84             ll_content.setVisibility(View.VISIBLE);
 85             ll_empty.setVisibility(View.GONE);
 86         }
 87     }
 88 
 89     @Override
 90     public void onClick(View v) {
 91         if (v.getId() == R.id.iv_menu) {
 92             openOptionsMenu();
 93         } else if (v.getId() == R.id.btn_shopping_channel) {
 94             Intent intent = new Intent(this, ShoppingChannelActivity.class);
 95             startActivity(intent);
 96         } else if (v.getId() == R.id.btn_settle) {
 97             AlertDialog.Builder builder = new AlertDialog.Builder(this);
 98             builder.setTitle("结算商品");
 99             builder.setMessage("客官抱歉,支付功能尚未开通,请下次再来");
100             builder.setPositiveButton("我知道了", null);
101             builder.create().show();
102         }
103     }
104 
105     @Override
106     public boolean onCreateOptionsMenu(Menu menu) {
107         getMenuInflater().inflate(R.menu.menu_cart, menu);
108         return true;
109     }
110     
111     @Override
112     public boolean onOptionsItemSelected(MenuItem item) {
113         int id = item.getItemId();
114         if (id == R.id.menu_shopping) {
115             Intent intent = new Intent(this, ShoppingChannelActivity.class);
116             startActivity(intent);
117         } else if (id == R.id.menu_clear) {
118             //清空购物车数据库
119             mCartHelper.deleteAll();
120             ll_cart.removeAllViews();
121             SharedUtil.getIntance(this).writeShared("count", "0");
122             showCount(0);
123             mCartGoods.clear();
124             mGoodsMap.clear();
125             Toast.makeText(this, "购物车已清空", Toast.LENGTH_SHORT).show();
126         } else if (id == R.id.menu_return) {
127             finish();
128         }
129         return true;
130     }
131 
132     private HashMap<Integer, CartInfo> mCartGoods = new HashMap<Integer, CartInfo>();
133     private View mContextView;
134     @Override
135     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
136         mContextView = v;
137         getMenuInflater().inflate(R.menu.menu_goods, menu);
138     }
139 
140     @Override
141     public boolean onContextItemSelected(MenuItem item) {
142         CartInfo info = mCartGoods.get(mContextView.getId());
143         int id = item.getItemId();
144         if (id == R.id.menu_detail) {
145             //跳转到查看商品详情页面
146             goDetail(info.goods_id);
147         } else if (id == R.id.menu_delete) {
148             //从购物车删除商品的数据库操作
149             long goods_id = info.goods_id;
150             mCartHelper.delete("goods_id="+goods_id);
151             ll_cart.removeView(mContextView);
152             //更新购物车中的商品数量
153             int left_count = mCount-info.count;
154             for (int i=0; i<mCartArray.size(); i++) {
155                 if (goods_id == mCartArray.get(i).goods_id) {
156                     left_count = mCount-mCartArray.get(i).count;
157                     mCartArray.remove(i);
158                     break;
159                 }
160             }
161             SharedUtil.getIntance(this).writeShared("count", ""+left_count);
162             showCount(left_count);
163             Toast.makeText(this, "已从购物车删除"+mGoodsMap.get(goods_id).name, Toast.LENGTH_SHORT).show();
164             mGoodsMap.remove(goods_id);
165             refreshTotalPrice();
166         }
167         return true;
168     }
169     
170     private void goDetail(long rowid) {
171         Intent intent = new Intent(this, ShoppingDetailActivity.class);
172         intent.putExtra("goods_id", rowid);
173         startActivity(intent);
174     }
175 
176     private GoodsDBHelper mGoodsHelper;
177     private CartDBHelper mCartHelper;
178     private String mFirst = "true";
179     
180     @Override
181     protected void onResume() {
182         super.onResume();
183         mCount = Integer.parseInt(SharedUtil.getIntance(this).readShared("count", "0"));
184         showCount(mCount);
185         mGoodsHelper = GoodsDBHelper.getInstance(this, 1);
186         mGoodsHelper.openWriteLink();
187         mCartHelper = CartDBHelper.getInstance(this, 1);
188         mCartHelper.openWriteLink();
189         mFirst = SharedUtil.getIntance(this).readShared("first", "true");
190         downloadGoods();
191         SharedUtil.getIntance(this).writeShared("first", "false");
192         showCart();
193     }
194     
195     @Override
196     protected void onPause() {
197         super.onPause();
198         mGoodsHelper.closeLink();
199         mCartHelper.closeLink();
200     }
201 
202     private int mBeginViewId = 0x7F24FFF0;
203     private ArrayList<CartInfo> mCartArray = new ArrayList<CartInfo>();
204     private HashMap<Long, GoodsInfo> mGoodsMap = new HashMap<Long, GoodsInfo>();
205     private void showCart() {
206         mCartArray = mCartHelper.query("1=1");
207         Log.d(TAG, "mCartArray.size()="+mCartArray.size());
208         if (mCartArray==null || mCartArray.size()<=0) {
209             return;
210         }
211         ll_cart.removeAllViews();
212         LinearLayout ll_row = newLinearLayout(LinearLayout.HORIZONTAL, LayoutParams.WRAP_CONTENT);
213         ll_row.addView(newTextView(0, 2, Gravity.CENTER, "图片", Color.BLACK, 15));
214         ll_row.addView(newTextView(0, 3, Gravity.CENTER, "名称", Color.BLACK, 15));
215         ll_row.addView(newTextView(0, 1, Gravity.CENTER, "数量", Color.BLACK, 15));
216         ll_row.addView(newTextView(0, 1, Gravity.CENTER, "单价", Color.BLACK, 15));
217         ll_row.addView(newTextView(0, 1, Gravity.CENTER, "总价", Color.BLACK, 15));
218         ll_cart.addView(ll_row);
219         for (int i=0; i<mCartArray.size(); i++) {
220             final CartInfo info = mCartArray.get(i);
221             GoodsInfo goods = mGoodsHelper.queryById(info.goods_id);
222             Log.d(TAG, "name="+goods.name+",price="+goods.price+",desc="+goods.desc);
223             mGoodsMap.put(info.goods_id, goods);
224             ll_row = newLinearLayout(LinearLayout.HORIZONTAL, LayoutParams.WRAP_CONTENT);
225             ll_row.setId(mBeginViewId+i);
226             //添加商品小图
227             ImageView iv_thumb = new ImageView(this);
228             LinearLayout.LayoutParams iv_params = new LinearLayout.LayoutParams(
229                     0, LayoutParams.WRAP_CONTENT, 2);
230             iv_thumb.setLayoutParams(iv_params);
231             iv_thumb.setScaleType(ScaleType.FIT_CENTER);
232             iv_thumb.setImageBitmap(MainApplication.getInstance().mIconMap.get(info.goods_id));
233             ll_row.addView(iv_thumb);
234             //添加商品名称与描述
235             LinearLayout ll_name = new LinearLayout(this);
236             LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
237                     0, LayoutParams.MATCH_PARENT, 3);
238             ll_name.setLayoutParams(params);
239             ll_name.setOrientation(LinearLayout.VERTICAL);
240             ll_name.addView(newTextView(-3, 1, Gravity.LEFT, goods.name, Color.BLACK, 17));
241             ll_name.addView(newTextView(-3, 1, Gravity.LEFT, goods.desc, Color.GRAY, 12));
242             ll_row.addView(ll_name);
243             //添加商品数量、单价和总价
244             ll_row.addView(newTextView(1, 1, Gravity.CENTER, ""+info.count, Color.BLACK, 17));
245             ll_row.addView(newTextView(1, 1, Gravity.RIGHT, ""+(int)goods.price, Color.BLACK, 15));
246             ll_row.addView(newTextView(1, 1, Gravity.RIGHT, ""+(int)(info.count*goods.price), Color.RED, 17));
247             //给商品行添加点击事件
248             ll_row.setOnClickListener(new OnClickListener() {
249                 @Override
250                 public void onClick(View v) {
251                     goDetail(info.goods_id);
252                 }
253             });
254             //给商品行注册上下文菜单
255             unregisterForContextMenu(ll_row);
256             registerForContextMenu(ll_row);
257             mCartGoods.put(ll_row.getId(), info);
258             ll_cart.addView(ll_row);
259         }
260         refreshTotalPrice();
261     }
262     
263     private void refreshTotalPrice() {
264         int total_price = 0;
265         for (CartInfo info : mCartArray) {
266             GoodsInfo goods = mGoodsMap.get(info.goods_id);
267             total_price += goods.price*info.count;
268         }
269         tv_total_price.setText(""+total_price);
270     }
271     
272     private LinearLayout newLinearLayout(int orientation, int height) {
273         LinearLayout ll_new = new LinearLayout(this);
274         LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
275                 LayoutParams.MATCH_PARENT, height);
276         //params.setMargins(2, 2, 2, 2);
277         ll_new.setLayoutParams(params);
278         ll_new.setOrientation(orientation);
279         ll_new.setBackgroundColor(Color.WHITE);
280         return ll_new;
281     }
282 
283     private TextView newTextView(int height, float weight, int gravity, String text, int textColor, int textSize) {
284         TextView tv_new = new TextView(this);
285         if (height == -3) {  //垂直排列
286             LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
287                     LayoutParams.MATCH_PARENT, 0, weight);
288             tv_new.setLayoutParams(params);
289         } else {  //水平排列
290             LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
291                     0, (height==0)?LayoutParams.WRAP_CONTENT:LayoutParams.MATCH_PARENT, weight);
292             tv_new.setLayoutParams(params);
293         }
294         tv_new.setText(text);
295         tv_new.setTextColor(textColor);
296         tv_new.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize);
297         tv_new.setGravity(Gravity.CENTER|gravity);
298         return tv_new;
299     }
300 
301     private String[] mNameArray = {
302             "iphone7", "Mate8", "小米5", "vivo X6S", "OPPO R9plus", "魅族Pro6"
303             };
304     private String[] mDescArray = {
305             "Apple iPhone 7 128GB 玫瑰金色 移动联通电信4G手机",
306             "华为 HUAWEI Mate8 3GB+32GB版 移动联通4G手机(月光银)",
307             "小米手机5 全网通 高配版 3GB内存 64GB 白色",
308             "vivo X6S 金色 全网通4G 双卡双待 4GB+64GB",
309             "OPPO R9plus 4GB+64GB内存版 金色 全网通4G手机 双卡双待",
310             "魅族Pro6全网通公开版 4+32GB 银白色 移动联通电信4G手机 双卡双待"
311             };
312     private float[] mPriceArray = {5888, 2499, 1799, 2298, 2499, 2199};
313     private int[] mThumbArray = {
314             R.drawable.iphone_s, R.drawable.huawei_s, R.drawable.xiaomi_s,
315             R.drawable.vivo_s, R.drawable.oppo_9p_s, R.drawable.meizu_s
316             };
317     private int[] mPicArray = {
318             R.drawable.iphone, R.drawable.huawei, R.drawable.xiaomi,
319             R.drawable.vivo, R.drawable.oppo_9p, R.drawable.meizu
320             };
321     //模拟网络数据,初始化数据库中的商品信息
322     private void downloadGoods() {
323         String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/";
324         if (mFirst.equals("true")) {
325             for (int i=0; i<mNameArray.length; i++) {
326                 GoodsInfo info = new GoodsInfo();
327                 info.name = mNameArray[i];
328                 info.desc = mDescArray[i];
329                 info.price = mPriceArray[i];
330                 long rowid = mGoodsHelper.insert(info);
331                 info.rowid = rowid;
332                 //往全局内存写入商品小图
333                 Bitmap thumb = BitmapFactory.decodeResource(getResources(), mThumbArray[i]);
334                 MainApplication.getInstance().mIconMap.put(rowid, thumb);
335                 String thumb_path = path + rowid + "_s.jpg";
336                 FileUtil.saveImage(thumb_path, thumb);
337                 info.thumb_path = thumb_path;
338                 //往SD卡保存商品大图
339                 Bitmap pic = BitmapFactory.decodeResource(getResources(), mPicArray[i]);
340                 String pic_path = path + rowid + ".jpg";
341                 FileUtil.saveImage(pic_path, pic);
342                 pic.recycle();
343                 info.pic_path = pic_path;
344                 mGoodsHelper.update(info);
345             }
346         } else {
347             ArrayList<GoodsInfo> goodsArray = mGoodsHelper.query("1=1");
348             for (int i=0; i<goodsArray.size(); i++) {
349                 GoodsInfo info = goodsArray.get(i);
350                 Bitmap thumb = BitmapFactory.decodeFile(info.thumb_path);
351                 MainApplication.getInstance().mIconMap.put(info.rowid, thumb);
352             }
353         }
354     }
355 
356     public static void startHome(Context mContext) {
357         Intent intent = new Intent(mContext, ShoppingCartActivity.class);
358         mContext.startActivity(intent);
359     }
360 
361 }
ShoppingChannelActivity:

  1 package com.example.alimjan.hello_world;
  2 
  3 import android.content.Intent;
  4 import android.graphics.Color;
  5 import android.os.Bundle;
  6 import android.support.v7.app.AppCompatActivity;
  7 import android.util.TypedValue;
  8 import android.view.Gravity;
  9 import android.view.View;
 10 import android.view.View.OnClickListener;
 11 import android.widget.Button;
 12 import android.widget.ImageView;
 13 import android.widget.ImageView.ScaleType;
 14 import android.widget.LinearLayout;
 15 import android.widget.LinearLayout.LayoutParams;
 16 import android.widget.TextView;
 17 import android.widget.Toast;
 18 
 19 import com.example.alimjan.hello_world.bean.CartInfo;
 20 import com.example.alimjan.hello_world.bean.GoodsInfo;
 21 import com.example.alimjan.hello_world.dataBase.CartDBHelper;
 22 import com.example.alimjan.hello_world.dataBase.GoodsDBHelper;
 23 import com.example.alimjan.hello_world.Utils.DateUtil;
 24 import com.example.alimjan.hello_world.Utils.SharedUtil;
 25 
 26 import java.util.ArrayList;
 27 
 28 /**
 29  * Created by alimjan on 2017/07/13.
 30  */
 31 public class ShoppingChannelActivity extends AppCompatActivity implements OnClickListener {
 32 
 33     private final static String TAG = "ShoppingChannelActivity";
 34     private TextView tv_title;
 35     private TextView tv_count;
 36     private LinearLayout ll_channel;
 37     private int mCount;
 38 
 39     @Override
 40     protected void onCreate(Bundle savedInstanceState) {
 41         super.onCreate(savedInstanceState);
 42         setContentView(R.layout.activity_shopping_channel);
 43         tv_title = (TextView) findViewById(R.id.tv_title);
 44         tv_count = (TextView) findViewById(R.id.tv_count);
 45         ll_channel = (LinearLayout) findViewById(R.id.ll_channel);
 46         findViewById(R.id.iv_cart).setOnClickListener(this);
 47         tv_title.setText("手机商场");
 48     }
 49 
 50     @Override
 51     public void onClick(View v) {
 52         if (v.getId() == R.id.iv_cart) {
 53             Intent intent = new Intent(this, ShoppingCartActivity.class);
 54             startActivity(intent);
 55         }
 56     }
 57 
 58     private void addToCart(long goods_id) {
 59         mCount++;
 60         tv_count.setText(""+mCount);
 61         SharedUtil.getIntance(this).writeShared("count", ""+mCount);
 62         CartInfo info = mCartHelper.queryByGoodsId(goods_id);
 63         if (info != null) {
 64             info.count++;
 65             info.update_time = DateUtil.getCurDateStr("");
 66             mCartHelper.update(info);
 67         } else {
 68             info = new CartInfo();
 69             info.goods_id = goods_id;
 70             info.count = 1;
 71             info.update_time = DateUtil.getCurDateStr("");
 72             mCartHelper.insert(info);
 73         }
 74     }
 75 
 76     private GoodsDBHelper mGoodsHelper;
 77     private CartDBHelper mCartHelper;
 78     
 79     @Override
 80     protected void onResume() {
 81         super.onResume();
 82         mCount = Integer.parseInt(SharedUtil.getIntance(this).readShared("count", "0"));
 83         tv_count.setText(""+mCount);
 84         mGoodsHelper = GoodsDBHelper.getInstance(this, 1);
 85         mGoodsHelper.openReadLink();
 86         mCartHelper = CartDBHelper.getInstance(this, 1);
 87         mCartHelper.openWriteLink();
 88         //展示商品列表
 89         showGoods();
 90     }
 91     
 92     @Override
 93     protected void onPause() {
 94         super.onPause();
 95         mGoodsHelper.closeLink();
 96         mCartHelper.closeLink();
 97     }
 98 
 99     private LayoutParams mFullParams, mHalfParams;
100     private void showGoods() {
101         ll_channel.removeAllViews();
102         mFullParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
103         mHalfParams = new LayoutParams(0, LayoutParams.WRAP_CONTENT, 1);
104         mHalfParams.setMargins(2, 2, 2, 2);
105         LinearLayout ll_row = newLinearLayout(LinearLayout.HORIZONTAL, 0);
106         ArrayList<GoodsInfo> goodsArray = mGoodsHelper.query("1=1");
107         int i=0;
108         for (; i<goodsArray.size(); i++) {
109             final GoodsInfo info = goodsArray.get(i);
110             LinearLayout ll_goods = newLinearLayout(LinearLayout.VERTICAL, 1);
111             ll_goods.setBackgroundColor(Color.WHITE);
112             //添加商品标题
113             TextView tv_name = new TextView(this);
114             tv_name.setLayoutParams(mFullParams);
115             tv_name.setGravity(Gravity.CENTER);
116             tv_name.setText(info.name);
117             tv_name.setTextColor(Color.BLACK);
118             tv_name.setTextSize(TypedValue.COMPLEX_UNIT_SP, 17);
119             ll_goods.addView(tv_name);
120             //添加商品小图
121             ImageView iv_thumb = new ImageView(this);
122             iv_thumb.setLayoutParams(new LayoutParams(
123                     LayoutParams.MATCH_PARENT, 200));
124             iv_thumb.setScaleType(ScaleType.FIT_CENTER);
125             iv_thumb.setImageBitmap(MainApplication.getInstance().mIconMap.get(info.rowid));
126             iv_thumb.setOnClickListener(new OnClickListener() {
127                 @Override
128                 public void onClick(View v) {
129                     Intent intent = new Intent(ShoppingChannelActivity.this, ShoppingDetailActivity.class);
130                     intent.putExtra("goods_id", info.rowid);
131                     startActivity(intent);
132                 }
133             });
134             ll_goods.addView(iv_thumb);
135             //添加商品价格
136             LinearLayout ll_bottom = newLinearLayout(LinearLayout.HORIZONTAL, 0);
137             TextView tv_price = new TextView(this);
138             tv_price.setLayoutParams(new LayoutParams(0, LayoutParams.WRAP_CONTENT, 2));
139             tv_price.setGravity(Gravity.CENTER);
140             tv_price.setText(""+(int)info.price);
141             tv_price.setTextColor(Color.RED);
142             tv_price.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15);
143             ll_bottom.addView(tv_price);
144             //添加购物车按钮
145             Button btn_add = new Button(this);
146             btn_add.setLayoutParams(new LayoutParams(0, LayoutParams.WRAP_CONTENT, 3));
147             btn_add.setGravity(Gravity.CENTER);
148             btn_add.setText("加入购物车");
149             btn_add.setTextColor(Color.BLACK);
150             btn_add.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15);
151             btn_add.setOnClickListener(new OnClickListener() {
152                 @Override
153                 public void onClick(View v) {
154                     addToCart(info.rowid);
155                     Toast.makeText(ShoppingChannelActivity.this, 
156                             "已添加一部"+info.name+"到购物车", Toast.LENGTH_SHORT).show();
157                 }
158             });
159             ll_bottom.addView(btn_add);
160             ll_goods.addView(ll_bottom);
161             //添加商品项目
162             ll_row.addView(ll_goods);
163             if (i%2 == 1) {
164                 ll_channel.addView(ll_row);
165                 ll_row = newLinearLayout(LinearLayout.HORIZONTAL, 0);
166             }
167         }
168         if (i%2 == 0) {
169             ll_row.addView(newLinearLayout(LinearLayout.VERTICAL, 1));
170             ll_channel.addView(ll_row);
171         }
172     }
173 
174     private LinearLayout newLinearLayout(int orientation, int weight) {
175         LinearLayout ll_new = new LinearLayout(this);
176         ll_new.setLayoutParams((weight==0)?mFullParams:mHalfParams);
177         ll_new.setOrientation(orientation);
178         return ll_new;
179     }
180 
181 }
ShoppingDetailActivity:
  1 package com.example.alimjan.hello_world;
  2 
  3 import android.content.Intent;
  4 import android.graphics.Bitmap;
  5 import android.graphics.BitmapFactory;
  6 import android.os.Bundle;
  7 import android.support.v7.app.AppCompatActivity;
  8 import android.view.View;
  9 import android.view.View.OnClickListener;
 10 import android.widget.ImageView;
 11 import android.widget.TextView;
 12 import android.widget.Toast;
 13 
 14 
 15 import com.example.alimjan.hello_world.bean.CartInfo;
 16 import com.example.alimjan.hello_world.bean.GoodsInfo;
 17 import com.example.alimjan.hello_world.dataBase.CartDBHelper;
 18 import com.example.alimjan.hello_world.dataBase.GoodsDBHelper;
 19 import com.example.alimjan.hello_world.Utils.DateUtil;
 20 import com.example.alimjan.hello_world.Utils.SharedUtil;
 21 
 22 /**
 23  * Created by alimjan on 2017/07/13.
 24  */
 25 public class ShoppingDetailActivity extends AppCompatActivity implements OnClickListener {
 26 
 27     private TextView tv_title;
 28     private TextView tv_count;
 29     private TextView tv_goods_price;
 30     private TextView tv_goods_desc;
 31     private ImageView iv_goods_pic;
 32     private int mCount;
 33     private long mGoodsId;
 34     
 35     @Override
 36     protected void onCreate(Bundle savedInstanceState) {
 37         super.onCreate(savedInstanceState);
 38         setContentView(R.layout.activity_shopping_detail);
 39         tv_title = (TextView) findViewById(R.id.tv_title);
 40         tv_count = (TextView) findViewById(R.id.tv_count);
 41         tv_goods_price = (TextView) findViewById(R.id.tv_goods_price);
 42         tv_goods_desc = (TextView) findViewById(R.id.tv_goods_desc);
 43         iv_goods_pic = (ImageView) findViewById(R.id.iv_goods_pic);
 44         findViewById(R.id.iv_cart).setOnClickListener(this);
 45         findViewById(R.id.btn_add_cart).setOnClickListener(this);
 46         
 47         mCount = Integer.parseInt(SharedUtil.getIntance(this).readShared("count", "0"));
 48         tv_count.setText(""+mCount);
 49     }
 50 
 51     @Override
 52     public void onClick(View v) {
 53         if (v.getId() == R.id.iv_cart) {
 54             Intent intent = new Intent(this, ShoppingCartActivity.class);
 55             startActivity(intent);
 56         } else if (v.getId() == R.id.btn_add_cart) {
 57             //添加购物车数据库
 58             addToCart(mGoodsId);
 59             Toast.makeText(this, "成功添加至购物车", Toast.LENGTH_SHORT).show();
 60         }
 61     }
 62     
 63     private void addToCart(long goods_id) {
 64         mCount++;
 65         tv_count.setText(""+mCount);
 66         SharedUtil.getIntance(this).writeShared("count", ""+mCount);
 67         CartInfo info = mCartHelper.queryByGoodsId(goods_id);
 68         if (info != null) {
 69             info.count++;
 70             info.update_time = DateUtil.getCurDateStr("");
 71             mCartHelper.update(info);
 72         } else {
 73             info = new CartInfo();
 74             info.goods_id = goods_id;
 75             info.count = 1;
 76             info.update_time = DateUtil.getCurDateStr("");
 77             mCartHelper.insert(info);
 78         }
 79     }
 80 
 81     private GoodsDBHelper mGoodsHelper;
 82     private CartDBHelper mCartHelper;
 83     
 84     @Override
 85     protected void onResume() {
 86         super.onResume();
 87         mGoodsHelper = GoodsDBHelper.getInstance(this, 1);
 88         mGoodsHelper.openReadLink();
 89         mCartHelper = CartDBHelper.getInstance(this, 1);
 90         mCartHelper.openWriteLink();
 91         //展示商品信息
 92         showDetail();
 93     }
 94     
 95     @Override
 96     protected void onPause() {
 97         super.onPause();
 98         mGoodsHelper.closeLink();
 99         mCartHelper.closeLink();
100     }
101     
102     private void showDetail() {
103         mGoodsId = getIntent().getLongExtra("goods_id", 0l);
104         if (mGoodsId > 0) {
105             GoodsInfo info = mGoodsHelper.queryById(mGoodsId);
106             tv_title.setText(info.name);
107             tv_goods_desc.setText(info.desc);
108             tv_goods_price.setText(""+info.price);
109             Bitmap pic = BitmapFactory.decodeFile(info.pic_path);
110             iv_goods_pic.setImageBitmap(pic);
111         }
112     }
113 
114 }
activity_shopping_cart.xml
 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="match_parent"
 3     android:layout_height="match_parent"
 4     android:background="#ffffdd"
 5     android:orientation="vertical" >
 6 
 7     <include layout="@layout/activity_shopping_title" />
 8 
 9     <ScrollView
10         android:layout_width="match_parent"
11         android:layout_height="wrap_content" >
12 
13         <FrameLayout
14             android:layout_width="match_parent"
15             android:layout_height="wrap_content"
16             android:padding="5dp" >
17             
18             <LinearLayout
19                 android:id="@+id/ll_content"
20                 android:layout_width="match_parent"
21                 android:layout_height="wrap_content"
22                 android:orientation="vertical"
23                 android:visibility="gone" >
24 
25                 <LinearLayout
26                     android:id="@+id/ll_cart"
27                     android:layout_width="match_parent"
28                     android:layout_height="wrap_content"
29                     android:orientation="vertical" >
30                 </LinearLayout>
31                 
32                 <LinearLayout
33                     android:layout_width="match_parent"
34                     android:layout_height="wrap_content"
35                     android:orientation="horizontal"
36                     android:padding="10dp" >
37 
38                     <TextView
39                         android:layout_width="0dp"
40                         android:layout_height="wrap_content"
41                         android:layout_weight="1"
42                         android:gravity="center|right"
43                         android:text="总金额:"
44                         android:textColor="@color/black"
45                         android:textSize="17sp" />
46 
47                     <TextView
48                         android:id="@+id/tv_total_price"
49                         android:layout_width="0dp"
50                         android:layout_height="wrap_content"
51                         android:layout_weight="2"
52                         android:gravity="center|left"
53                         android:textColor="@color/red"
54                         android:textSize="25sp" />
55 
56                     <Button
57                         android:id="@+id/btn_settle"
58                         android:layout_width="0dp"
59                         android:layout_height="wrap_content"
60                         android:layout_weight="1"
61                         android:gravity="center"
62                         android:text="结算"
63                         android:textColor="@color/black"
64                         android:textSize="20sp" />
65                 </LinearLayout>
66 
67             </LinearLayout>
68 
69             <LinearLayout
70                 android:id="@+id/ll_empty"
71                 android:layout_width="match_parent"
72                 android:layout_height="wrap_content"
73                 android:orientation="vertical"
74                 android:visibility="gone" >
75 
76                 <TextView
77                     android:layout_width="match_parent"
78                     android:layout_height="wrap_content"
79                     android:layout_marginBottom="100dp"
80                     android:layout_marginTop="100dp"
81                     android:gravity="center"
82                     android:text="哎呀,购物车空空如也,快去选购商品吧"
83                     android:textColor="@color/black"
84                     android:textSize="17sp" />
85 
86                 <Button
87                     android:id="@+id/btn_shopping_channel"
88                     android:layout_width="match_parent"
89                     android:layout_height="wrap_content"
90                     android:gravity="center"
91                     android:text="逛逛手机商场"
92                     android:textColor="@color/black"
93                     android:textSize="17sp" />
94             </LinearLayout>
95         </FrameLayout>
96     </ScrollView>
97 
98 </LinearLayout>
activity_shopping_channel.xml
 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="match_parent"
 3     android:layout_height="match_parent"
 4     android:background="#ffffdd"
 5     android:orientation="vertical" >
 6 
 7     <include layout="@layout/activity_shopping_title" />
 8 
 9     <ScrollView
10         android:layout_width="match_parent"
11         android:layout_height="wrap_content" >
12 
13         <LinearLayout
14             android:id="@+id/ll_channel"
15             android:layout_width="match_parent"
16             android:layout_height="wrap_content"
17             android:padding="5dp"
18             android:orientation="vertical" >
19         </LinearLayout>
20     </ScrollView>
21 
22 </LinearLayout>
 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="match_parent"
 3     android:layout_height="match_parent"
 4     android:background="#ffffdd"
 5     android:orientation="vertical" >
 6 
 7     <include layout="@layout/activity_shopping_title" />
 8 
 9     <ScrollView
10         android:layout_width="match_parent"
11         android:layout_height="wrap_content" >
12 
13         <LinearLayout
14             android:layout_width="match_parent"
15             android:layout_height="wrap_content"
16             android:padding="5dp"
17             android:orientation="vertical" >
18 
19             <ImageView
20                 android:id="@+id/iv_goods_pic"
21                 android:layout_width="match_parent"
22                 android:layout_height="400dp"
23                 android:scaleType="fitCenter" />
24 
25             <TextView
26                 android:id="@+id/tv_goods_price"
27                 android:layout_width="match_parent"
28                 android:layout_height="wrap_content"
29                 android:textColor="@color/red"
30                 android:textSize="22sp" />
31 
32             <TextView
33                 android:id="@+id/tv_goods_desc"
34                 android:layout_width="match_parent"
35                 android:layout_height="wrap_content"
36                 android:textColor="@color/black"
37                 android:textSize="15sp" />
38 
39             <Button
40                 android:id="@+id/btn_add_cart"
41                 android:layout_width="match_parent"
42                 android:layout_height="wrap_content"
43                 android:text="加入购物车"
44                 android:textColor="@color/black"
45                 android:textSize="17sp" />
46         </LinearLayout>
47     </ScrollView>
48 
49 </LinearLayout>

 

  一些工具类:

  1 package com.example.alimjan.hello_world.Utils;
  2 
  3 import android.graphics.Bitmap;
  4 import android.graphics.BitmapFactory;
  5 
  6 import java.io.BufferedInputStream;
  7 import java.io.BufferedOutputStream;
  8 import java.io.File;
  9 import java.io.FileInputStream;
 10 import java.io.FileOutputStream;
 11 import java.io.FilenameFilter;
 12 import java.util.ArrayList;
 13 import java.util.Locale;
 14 
 15 public class FileUtil {
 16 
 17     public static void saveText(String path, String txt) {
 18         try {
 19             FileOutputStream fos = new FileOutputStream(path);
 20             fos.write(txt.getBytes());
 21             fos.close();
 22         } catch (Exception e) {
 23             e.printStackTrace();
 24         }
 25     }
 26 
 27     public static String openText(String path) {
 28         String readStr = "";
 29         try {
 30             FileInputStream fis = new FileInputStream(path);
 31             byte[] b = new byte[fis.available()];
 32             fis.read(b);
 33             readStr = new String(b);
 34             fis.close();
 35         } catch (Exception e) {
 36             e.printStackTrace();
 37         }
 38         return readStr;
 39     }
 40 
 41     public static void saveImage(String path, Bitmap bitmap) {
 42         try {
 43             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(path));
 44             bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);
 45             bos.flush();
 46             bos.close();
 47         } catch (Exception e) {
 48             e.printStackTrace();
 49         }
 50     }
 51     
 52     public static Bitmap openImage(String path) {
 53         Bitmap bitmap = null;
 54         try {
 55             BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));
 56             bitmap = BitmapFactory.decodeStream(bis);
 57             bis.close();
 58         } catch (Exception e) {
 59             e.printStackTrace();
 60         }
 61         return bitmap;
 62     }
 63     
 64     public static ArrayList<File> getFileList(String path, String[] extendArray) {
 65         ArrayList<File> displayedContent = new ArrayList<File>();
 66         File[] files = null;
 67         File directory = new File(path);
 68         if (extendArray != null && extendArray.length>0) {
 69             FilenameFilter fileFilter = getTypeFilter(extendArray);
 70             files = directory.listFiles(fileFilter);
 71         } else {
 72             files = directory.listFiles();
 73         }
 74 
 75         if (files != null) {
 76             for (File f : files) {
 77                 if (!f.isDirectory() && !f.isHidden()) {
 78                     displayedContent.add(f);
 79                 }
 80             }
 81         }
 82         return displayedContent;
 83     }
 84 
 85     public static FilenameFilter getTypeFilter(String[] extendArray) {
 86         final ArrayList<String> fileExtensions = new ArrayList<String>();
 87         for (int i=0; i<extendArray.length; i++) {
 88             fileExtensions.add(extendArray[i]);
 89         }
 90         FilenameFilter fileNameFilter = new FilenameFilter() {
 91             @Override
 92             public boolean accept(File directory, String fileName) {
 93                 boolean matched = false;
 94                 File f = new File(String.format("%s/%s",
 95                         directory.getAbsolutePath(), fileName));
 96                 matched = f.isDirectory();
 97                 if (!matched) {
 98                     for (String s : fileExtensions) {
 99                         s = String.format(".{0,}\\%s$", s);
100                         s = s.toUpperCase(Locale.getDefault());
101                         fileName = fileName.toUpperCase(Locale.getDefault());
102                         matched = fileName.matches(s);
103                         if (matched) {
104                             break;
105                         }
106                     }
107                 }
108                 return matched;
109             }
110         };
111         return fileNameFilter;
112     }
113 
114 }
View Code
  1 package com.example.alimjan.hello_world.dataBase;
  2 
  3 import android.content.ContentValues;
  4 import android.content.Context;
  5 import android.database.Cursor;
  6 import android.database.sqlite.SQLiteDatabase;
  7 import android.database.sqlite.SQLiteOpenHelper;
  8 import android.util.Log;
  9 
 10 import com.example.alimjan.hello_world.bean.GoodsInfo;
 11 
 12 import java.util.ArrayList;
 13 
 14 public class GoodsDBHelper extends SQLiteOpenHelper {
 15     private static final String TAG = "GoodsDBHelper";
 16     private static final String DB_NAME = "goods.db";
 17     private static final int DB_VERSION = 1;
 18     private static GoodsDBHelper mHelper = null;
 19     private SQLiteDatabase mDB = null;
 20     private static final String TABLE_NAME = "goods_info";
 21 
 22     private GoodsDBHelper(Context context) {
 23         super(context, DB_NAME, null, DB_VERSION);
 24     }
 25 
 26     private GoodsDBHelper(Context context, int version) {
 27         super(context, DB_NAME, null, version);
 28     }
 29 
 30     public static GoodsDBHelper getInstance(Context context, int version) {
 31         if (version > 0 && mHelper == null) {
 32             mHelper = new GoodsDBHelper(context, version);
 33         } else if (mHelper == null) {
 34             mHelper = new GoodsDBHelper(context);
 35         }
 36         return mHelper;
 37     }
 38 
 39     public SQLiteDatabase openReadLink() {
 40         if (mDB == null || mDB.isOpen() != true) {
 41             mDB = mHelper.getReadableDatabase();
 42         }
 43         return mDB;
 44     }
 45 
 46     public SQLiteDatabase openWriteLink() {
 47         if (mDB == null || mDB.isOpen() != true) {
 48             mDB = mHelper.getWritableDatabase();
 49         }
 50         return mDB;
 51     }
 52 
 53     public void closeLink() {
 54         if (mDB != null && mDB.isOpen() == true) {
 55             mDB.close();
 56             mDB = null;
 57         }
 58     }
 59     
 60     public String getDBName() {
 61         if (mHelper != null) {
 62             return mHelper.getDatabaseName();
 63         } else {
 64             return DB_NAME;
 65         }
 66     }
 67     
 68     @Override
 69     public void onCreate(SQLiteDatabase db) {
 70         Log.d(TAG, "onCreate");
 71         String drop_sql = "DROP TABLE IF EXISTS " + TABLE_NAME + ";";
 72         Log.d(TAG, "drop_sql:" + drop_sql);
 73         db.execSQL(drop_sql);
 74         String create_sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " ("
 75                 + "_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
 76                 + "name VARCHAR NOT NULL," + "desc VARCHAR NOT NULL,"
 77                 + "price FLOAT NOT NULL," + "thumb_path VARCHAR NOT NULL,"
 78                 + "pic_path VARCHAR NOT NULL"
 79                 + ");";
 80         Log.d(TAG, "create_sql:" + create_sql);
 81         db.execSQL(create_sql);
 82     }
 83 
 84     @Override
 85     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 86     }
 87     
 88     public int delete(String condition) {
 89         int count = mDB.delete(TABLE_NAME, condition, null);
 90         return count;
 91     }
 92 
 93     public int deleteAll() {
 94         int count = mDB.delete(TABLE_NAME, "1=1", null);
 95         return count;
 96     }
 97 
 98     public long insert(GoodsInfo info) {
 99         ArrayList<GoodsInfo> infoArray = new ArrayList<GoodsInfo>();
100         infoArray.add(info);
101         return insert(infoArray);
102     }
103     
104     public long insert(ArrayList<GoodsInfo> infoArray) {
105         long result = -1;
106         for (int i = 0; i < infoArray.size(); i++) {
107             GoodsInfo info = infoArray.get(i);
108             // 如果存在相同rowid的记录,则更新记录
109             if (info.rowid > 0) {
110                 String condition = String.format("rowid='%d'", info.rowid);
111                 update(info, condition);
112                 result = info.rowid;
113                 continue;
114             }
115             // 不存在唯一性重复的记录,则插入新记录
116             ContentValues cv = new ContentValues();
117             cv.put("name", info.name);
118             cv.put("desc", info.desc);
119             cv.put("price", info.price);
120             cv.put("thumb_path", info.thumb_path);
121             cv.put("pic_path", info.pic_path);
122             result = mDB.insert(TABLE_NAME, "", cv);
123             // 添加成功后返回行号,失败后返回-1
124             if (result == -1) {
125                 return result;
126             }
127         }
128         return result;
129     }
130 
131     public int update(GoodsInfo info, String condition) {
132         ContentValues cv = new ContentValues();
133         cv.put("name", info.name);
134         cv.put("desc", info.desc);
135         cv.put("price", info.price);
136         cv.put("thumb_path", info.thumb_path);
137         cv.put("pic_path", info.pic_path);
138         int count = mDB.update(TABLE_NAME, cv, condition, null);
139         return count;
140     }
141 
142     public int update(GoodsInfo info) {
143         return update(info, "rowid="+info.rowid);
144     }
145 
146     public ArrayList<GoodsInfo> query(String condition) {
147         String sql = String.format("select rowid,_id,name,desc,price,thumb_path,pic_path" +
148                 " from %s where %s;", TABLE_NAME, condition);
149         Log.d(TAG, "query sql: "+sql);
150         ArrayList<GoodsInfo> infoArray = new ArrayList<GoodsInfo>();
151         Cursor cursor = mDB.rawQuery(sql, null);
152         if (cursor.moveToFirst()) {
153             for (;; cursor.moveToNext()) {
154                 GoodsInfo info = new GoodsInfo();
155                 info.rowid = cursor.getLong(0);
156                 info.xuhao = cursor.getInt(1);
157                 info.name = cursor.getString(2);
158                 info.desc = cursor.getString(3);
159                 info.price = cursor.getFloat(4);
160                 info.thumb_path = cursor.getString(5);
161                 info.pic_path = cursor.getString(6);
162                 infoArray.add(info);
163                 if (cursor.isLast() == true) {
164                     break;
165                 }
166             }
167         }
168         cursor.close();
169         return infoArray;
170     }
171     
172     public GoodsInfo queryById(long rowid) {
173         GoodsInfo info = null;
174         ArrayList<GoodsInfo> infoArray = query(String.format("rowid='%d'", rowid));
175         if (infoArray.size() > 0) {
176             info = infoArray.get(0);
177         }
178         return info;
179     }
180 
181 }
View Code
  1 package com.example.alimjan.hello_world.dataBase;
  2 
  3 import android.content.ContentValues;
  4 import android.content.Context;
  5 import android.database.Cursor;
  6 import android.database.sqlite.SQLiteDatabase;
  7 import android.database.sqlite.SQLiteOpenHelper;
  8 import android.util.Log;
  9 
 10 import com.example.alimjan.hello_world.bean.CartInfo;
 11 
 12 import java.util.ArrayList;
 13 
 14 public class CartDBHelper extends SQLiteOpenHelper {
 15     private static final String TAG = "CartDBHelper";
 16     private static final String DB_NAME = "cart.db";
 17     private static final int DB_VERSION = 1;
 18     private static CartDBHelper mHelper = null;
 19     private SQLiteDatabase mDB = null;
 20     private static final String TABLE_NAME = "cart_info";
 21 
 22     private CartDBHelper(Context context) {
 23         super(context, DB_NAME, null, DB_VERSION);
 24     }
 25 
 26     private CartDBHelper(Context context, int version) {
 27         super(context, DB_NAME, null, version);
 28     }
 29 
 30     public static CartDBHelper getInstance(Context context, int version) {
 31         if (version > 0 && mHelper == null) {
 32             mHelper = new CartDBHelper(context, version);
 33         } else if (mHelper == null) {
 34             mHelper = new CartDBHelper(context);
 35         }
 36         return mHelper;
 37     }
 38 
 39     public SQLiteDatabase openReadLink() {
 40         if (mDB == null || mDB.isOpen() != true) {
 41             mDB = mHelper.getReadableDatabase();
 42         }
 43         return mDB;
 44     }
 45 
 46     public SQLiteDatabase openWriteLink() {
 47         if (mDB == null || mDB.isOpen() != true) {
 48             mDB = mHelper.getWritableDatabase();
 49         }
 50         return mDB;
 51     }
 52 
 53     public void closeLink() {
 54         if (mDB != null && mDB.isOpen() == true) {
 55             mDB.close();
 56             mDB = null;
 57         }
 58     }
 59     
 60     public String getDBName() {
 61         if (mHelper != null) {
 62             return mHelper.getDatabaseName();
 63         } else {
 64             return DB_NAME;
 65         }
 66     }
 67     
 68     @Override
 69     public void onCreate(SQLiteDatabase db) {
 70         Log.d(TAG, "onCreate");
 71         String drop_sql = "DROP TABLE IF EXISTS " + TABLE_NAME + ";";
 72         Log.d(TAG, "drop_sql:" + drop_sql);
 73         db.execSQL(drop_sql);
 74         String create_sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " ("
 75                 + "_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
 76                 + "goods_id LONG NOT NULL," + "count INTEGER NOT NULL,"
 77                 + "update_time VARCHAR NOT NULL"
 78                 + ");";
 79         Log.d(TAG, "create_sql:" + create_sql);
 80         db.execSQL(create_sql);
 81     }
 82 
 83     @Override
 84     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 85     }
 86     
 87     public int delete(String condition) {
 88         int count = mDB.delete(TABLE_NAME, condition, null);
 89         return count;
 90     }
 91 
 92     public int deleteAll() {
 93         int count = mDB.delete(TABLE_NAME, "1=1", null);
 94         return count;
 95     }
 96 
 97     public long insert(CartInfo info) {
 98         ArrayList<CartInfo> infoArray = new ArrayList<CartInfo>();
 99         infoArray.add(info);
100         return insert(infoArray);
101     }
102     
103     public long insert(ArrayList<CartInfo> infoArray) {
104         long result = -1;
105         for (int i = 0; i < infoArray.size(); i++) {
106             CartInfo info = infoArray.get(i);
107             Log.d(TAG, "goods_id="+info.goods_id+", count="+info.count);
108             // 如果存在相同rowid的记录,则更新记录
109             if (info.rowid > 0) {
110                 String condition = String.format("rowid='%d'", info.rowid);
111                 update(info, condition);
112                 result = info.rowid;
113                 continue;
114             }
115             // 不存在唯一性重复的记录,则插入新记录
116             ContentValues cv = new ContentValues();
117             cv.put("goods_id", info.goods_id);
118             cv.put("count", info.count);
119             cv.put("update_time", info.update_time);
120             result = mDB.insert(TABLE_NAME, "", cv);
121             // 添加成功后返回行号,失败后返回-1
122             if (result == -1) {
123                 return result;
124             }
125         }
126         return result;
127     }
128 
129     public int update(CartInfo info, String condition) {
130         ContentValues cv = new ContentValues();
131         cv.put("goods_id", info.goods_id);
132         cv.put("count", info.count);
133         cv.put("update_time", info.update_time);
134         int count = mDB.update(TABLE_NAME, cv, condition, null);
135         return count;
136     }
137 
138     public int update(CartInfo info) {
139         return update(info, "rowid="+info.rowid);
140     }
141 
142     public ArrayList<CartInfo> query(String condition) {
143         String sql = String.format("select rowid,_id,goods_id,count,update_time" +
144                 " from %s where %s;", TABLE_NAME, condition);
145         Log.d(TAG, "query sql: "+sql);
146         ArrayList<CartInfo> infoArray = new ArrayList<CartInfo>();
147         Cursor cursor = mDB.rawQuery(sql, null);
148         if (cursor.moveToFirst()) {
149             for (;; cursor.moveToNext()) {
150                 CartInfo info = new CartInfo();
151                 info.rowid = cursor.getLong(0);
152                 info.xuhao = cursor.getInt(1);
153                 info.goods_id = cursor.getLong(2);
154                 info.count = cursor.getInt(3);
155                 info.update_time = cursor.getString(4);
156                 infoArray.add(info);
157                 if (cursor.isLast() == true) {
158                     break;
159                 }
160             }
161         }
162         cursor.close();
163         return infoArray;
164     }
165     
166     public CartInfo queryById(long rowid) {
167         CartInfo info = null;
168         ArrayList<CartInfo> infoArray = query(String.format("rowid='%d'", rowid));
169         if (infoArray.size() > 0) {
170             info = infoArray.get(0);
171         }
172         return info;
173     }
174 
175     public CartInfo queryByGoodsId(long goods_id) {
176         CartInfo info = null;
177         ArrayList<CartInfo> infoArray = query(String.format("goods_id='%d'", goods_id));
178         if (infoArray.size() > 0) {
179             info = infoArray.get(0);
180         }
181         return info;
182     }
183 
184 }
View Code
 1 package com.example.alimjan.hello_world.bean;
 2 
 3 public class GoodsInfo {
 4     public long rowid;
 5     public int xuhao;
 6     public String name;
 7     public String desc;
 8     public float price;
 9     public String thumb_path;
10     public String pic_path;
11     
12     public GoodsInfo() {
13         rowid = 0l;
14         xuhao = 0;
15         name = "";
16         desc = "";
17         price = 0;
18         thumb_path = "";
19         pic_path = "";
20     }
21 }
View Code
 1 package com.example.alimjan.hello_world.bean;
 2 
 3 public class CartInfo {
 4     public long rowid;
 5     public int xuhao;
 6     public long goods_id;
 7     public int count;
 8     public String update_time;
 9     
10     public CartInfo() {
11         rowid = 0l;
12         xuhao = 0;
13         goods_id = 0l;
14         count = 0;
15         update_time = "";
16     }
17 }
View Code
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/menu_shopping"
        android:orderInCategory="1"
        android:title="去商场购物"/>

    <item
        android:id="@+id/menu_clear"
        android:orderInCategory="2"
        android:title="清空购物车"/>
    
    <item
        android:id="@+id/menu_return"
        android:orderInCategory="9"
        android:title="返回"/>
    
</menu>
View Code
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/menu_detail"
        android:orderInCategory="1"
        android:title="查看商品详情"/>

    <item
        android:id="@+id/menu_delete"
        android:orderInCategory="2"
        android:title="从购物车删除"/>
    
</menu>
View Code
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >

    <solid android:color="#ff6666" />

</shape>
View Code

 

 

到此也就完成的差不多了,一些工具类放在下面了。

 

转载于:https://www.cnblogs.com/alimjan/p/7157833.html

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值