华南理工大学无线电爱好者协会软件小组

安卓应用之简易购物车实现

2017-10-17  本文已影响30人  平淡如水_43f6

基本要求

1、分三个界面,商品界面、购物车界面和商品详情界面

2、使用adapter填充数据

3、点击购买后购物车进入购物车可显示相应商品

4、能够在本地保存商品,即当下一次打开app时购物车能够显示购买的商品

5、清空购物车,并在清空时显示总价格

�开发环境

1)JDK(Java Development Kit)JDK是Java语言的软件开发工具包,主要用于移动设备、嵌入设备上的java应用程序。

2)SDK(software development kit) SDK是软件开发工具包。 被软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合

作者:zwb

界面设计

主界面

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000000"
    tools:context="com.example.shoppingcar.MainActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:id="@+id/linearlayout1">
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_gravity="center_horizontal"
            android:layout_marginBottom="20dp">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/jiesuan"
                android:textColor="#ffffff"
                android:textSize="22sp"
                android:layout_gravity="center"/>
            <ImageView
                android:layout_width="25dp"
                android:layout_height="25dp"
                android:src="@drawable/shoppingcar"
                android:clickable="true"
                android:id="@+id/btnbuy"/>
        </LinearLayout>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="18sp"
            android:text="@string/list"
            android:textColor="#ffffff"
            />
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="2dp"
            android:background="#ffffff"/>

        <ListView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/listview"
            android:divider="#fcfcfc"
            android:dividerHeight="0.5dp"
            ></ListView>
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="2dp"
            android:background="#ffffff"/>
    </LinearLayout>
</RelativeLayout>
Paste_Image.png

结算界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.shoppingcar.jiesuanActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="25sp"
        android:id="@+id/zongjia"
        />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="25sp"
        android:id="@+id/goumaiqingdan"/>
</LinearLayout>
Paste_Image.png

展示商品详细信息的界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.shoppingcar.DetailActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textviewiteminfo"/>
    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:id="@+id/itemimage"
        />

</LinearLayout>
Paste_Image.png

为主界面的listview设置一个子布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="80dp">

    <ImageView
        android:layout_height="60dp"
        android:layout_width="60dp"
        android:id="@+id/imageview"
        android:layout_alignParentLeft="true"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:layout_marginLeft="10dp"
        />
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:id="@+id/linearlayout"
        android:layout_toRightOf="@id/imageview"
        android:layout_marginLeft="10dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/itemname"
            android:textSize="20sp"
            android:textColor="#ffffff"
            android:gravity="center"
            android:layout_marginBottom="2dp"
            android:layout_marginTop="5dp"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:id="@+id/textview"
            android:textSize="28sp"
            android:textColor="#ffffff"
            />
    </LinearLayout>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:id="@+id/btndetail"
        android:focusable="false"
        android:layout_alignParentRight="true"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:text="@string/detail"
        android:textColor="#000000"/>
    <CheckBox
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:id="@+id/checkbox"
        android:layout_toLeftOf="@id/btndetail"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:theme="@style/My_CheckBox"/>
</RelativeLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private List<ShoppingItem> shoppingItems = new ArrayList<>();
    private ShoppingItemDataopenHelper shoppingItemDataopenHelper;
    private SQLiteDatabase sqLiteDatabase;
    private ListView listView;
    private ImageView btnbuy;
    private boolean isFirstCheck;
    private boolean isListChanged;
    private LocalBroadcastManager localBroadcastManager;
    private MyReceiver myReceiver;

    class MyReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            if (!isListChanged){
                isListChanged=true;
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        localBroadcastManager.unregisterReceiver(myReceiver);
    }
    private void initView(){
        isFirstCheck=true;
        isListChanged=false;
        localBroadcastManager=LocalBroadcastManager.getInstance(this);
        IntentFilter intentFilter=new IntentFilter("com.example.shoppingcar.MAINACTIVITY");
        myReceiver=new MyReceiver();
        localBroadcastManager.registerReceiver(myReceiver,intentFilter);
        shoppingItemDataopenHelper=new ShoppingItemDataopenHelper(MainActivity.this,"shoppingitems.db",null,1);
        sqLiteDatabase=shoppingItemDataopenHelper.getWritableDatabase();
        listView=(ListView)findViewById(R.id.listview);
        btnbuy=(ImageView) findViewById(R.id.btnbuy);
        initshoppingitems();
        ShoppingItemAdapter shoppingItemAdapter=new ShoppingItemAdapter(MainActivity.this,R.layout.shoppingitemleyout,shoppingItems);
        listView.setAdapter(shoppingItemAdapter);
        shoppingItemAdapter.notifyDataSetChanged();
        btnbuy.setOnClickListener(new View.OnClickListener() {
            double priceaddAll;
            String itemshad;
            @Override
            public void onClick(View view) {
                Cursor cursor=sqLiteDatabase.query("Shoppinglist",null,null,null,null,null,null);
                if (isFirstCheck&&!isListChanged){
                    if (cursor!=null) {
                        cursor.moveToFirst();
                        priceaddAll = cursor.getDouble(cursor.getColumnIndex("priceOfItems"));
                        itemshad = cursor.getString(cursor.getColumnIndex("namesOfItems"));
                    }else {
                        priceaddAll=0.00;
                        itemshad="您没有购买任何商品";
                    }
                    isFirstCheck=false;
                    Intent intent = new Intent(MainActivity.this, jiesuanActivity.class);
                    intent.putExtra("itemshad", itemshad);
                    intent.putExtra("priceaddAll", priceaddAll);
                    startActivity(intent);
                    return;
                }
                if (isFirstCheck&&isListChanged){
                    priceaddAll=0.00;
                    itemshad="您购买的商品有:";
                    for (ShoppingItem item:shoppingItems){
                        if (item.ischosen()){
                            priceaddAll=priceaddAll+item.getPrice();
                            itemshad=itemshad+"\n"+item.getItemname();
                        }
                    }
                    if (priceaddAll==0.00){
                        itemshad="您没有购买任何商品";
                    }
                    if (cursor!=null){
                        sqLiteDatabase.delete("Shoppinglist",null,null);
                    }
                    ContentValues contentValues=new ContentValues();
                    contentValues.put("priceOfItems",priceaddAll);
                    contentValues.put("namesOfItems",itemshad);
                    sqLiteDatabase.insert("Shoppinglist",null,contentValues);
                    isListChanged=true;
                    isFirstCheck=false;
                    Intent intent=new Intent(MainActivity.this,jiesuanActivity.class);
                    intent.putExtra("itemshad",itemshad);
                    intent.putExtra("priceaddAll",priceaddAll);
                    startActivity(intent);
                    return;
                }
                priceaddAll=0.00;
                itemshad="您购买的商品有:";
                for (ShoppingItem item:shoppingItems){
                    if (item.ischosen()){
                        priceaddAll=priceaddAll+item.getPrice();
                        itemshad=itemshad+"\n"+item.getItemname();
                    }
                }
                if (priceaddAll==0.00){
                    itemshad="您没有购买任何商品";
                }
                if (cursor!=null){
                    sqLiteDatabase.delete("Shoppinglist",null,null);
                }
                ContentValues contentValues=new ContentValues();
                contentValues.put("priceOfItems",priceaddAll);
                contentValues.put("namesOfItems",itemshad);
                sqLiteDatabase.insert("Shoppinglist",null,contentValues);
                Intent intent=new Intent(MainActivity.this,jiesuanActivity.class);
                intent.putExtra("itemshad",itemshad);
                intent.putExtra("priceaddAll",priceaddAll);
                startActivity(intent);
            }
        });
    }

    public void initshoppingitems(){
        ShoppingItem cake=new ShoppingItem("蛋糕",R.drawable.present,5.00,"单价:5.00元\n出产地:广州\n保质期:180天\n生产日期:2017年1月1日");
        ShoppingItem love=new ShoppingItem("爱心",R.drawable.love,10.00,"单价:10.00元");
        ShoppingItem mouse=new ShoppingItem("鼠标",R.drawable.mouse,200.00,"出产地:深圳\n单价:200元");
        ShoppingItem musiccd=new ShoppingItem("唱片",R.drawable.musiccd,200.00,"单价:30.00元");
        ShoppingItem present=new ShoppingItem("礼物",R.drawable.cake,150.00,"单价:150.00元");
        ShoppingItem stamp=new ShoppingItem("邮票",R.drawable.stamp,0.10,"单价:0.10元");
        shoppingItems.add(cake);
        shoppingItems.add(love);
        shoppingItems.add(mouse);
        shoppingItems.add(musiccd);
        shoppingItems.add(present);
        shoppingItems.add(stamp);
    }
}

我们看到要求的第四点:能够在本地保存商品,即当下一次打开app时购物车能够显示购买的商品。
每一次打开app,将isFirstChecked(变量用于判断是否第一次查看已购买的商品)初始化为true,将isListChanged(判断第一次查看前是否对购物清单进行了修改)初始化为false。
打开app并点击结算旁边的imagebutton时,可能出现以下情况:
1、第一次按这个按钮,不点击checkbox复选框对已买的商品进行任何修改,直接按。这时判断查询数据库的游标cursor是否为空,如果为空(之前没打开过app加过东西),输出总价为0,没有买任何商品;cursor不为空(之前打开过app加过东西),移到第一行读出数据库中储存的商品总价、购物清单。
2、直接修改(按checkbox)然后第一次按。遍历shoopingitems清单,读出checkbox勾选了的商品,进行总价的计算、已购买商品名称的统计(加到一个字符串里),更新数据库内容,然后跳转到另一个Activity。
以上两种操作结束后都将isFirstChecked值改为false,于是就不会进行前两种判断了。
然后其他情况(不是第一次点的话)就看cursor查出来数据库内容是否为空,空的话就直接插入内容。非空就直接删掉数据库内容,插入最新的商品总价和已购买清单。

适配器

public class ShoppingItemAdapter extends ArrayAdapter {
    private List<ShoppingItem> myshoppingitems;
    private int ResourceId;
    private LocalBroadcastManager localBroadcastManager;
    public ShoppingItemAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull List objects) {
        super(context, resource, objects);
        myshoppingitems=objects;
        ResourceId=resource;
        localBroadcastManager=LocalBroadcastManager.getInstance(context);
    }
    class ViewHolder{
        ImageView itemimage;
        TextView itemname;
        CheckBox checkBox;
        Button btnitemdetail;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        final ShoppingItem shoppingItem=(ShoppingItem)getItem(position);
        final View view;
        final ViewHolder viewHolder;
        if (convertView==null){
            view= LayoutInflater.from(getContext()).inflate(ResourceId,parent,false);
            viewHolder=new ViewHolder();
            viewHolder.itemimage=(ImageView)view.findViewById(R.id.imageview);
            viewHolder.itemname=(TextView)view.findViewById(R.id.textview);
            viewHolder.checkBox=(CheckBox)view.findViewById(R.id.checkbox);
            viewHolder.btnitemdetail=(Button)view.findViewById(R.id.btndetail);
            view.setTag(viewHolder);
        }else {
            view=convertView;
            viewHolder=(ViewHolder)view.getTag();
        }
        viewHolder.itemimage.setImageResource(shoppingItem.getImageId());
        viewHolder.itemname.setText(shoppingItem.getItemname());
        viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                shoppingItem.setIschosen(b);
                Intent intent=new Intent("com.example.shoppingcar.MAINACTIVITY");
                localBroadcastManager.sendBroadcast(intent);
            }
        });
        viewHolder.btnitemdetail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent=new Intent(getContext(),DetailActivity.class);
                intent.putExtra("iteminformation",shoppingItem.getInformation());
                intent.putExtra("itemimage",shoppingItem.getImageId());
                getContext().startActivity(intent);
            }
        });
        return view;
    }
}

SQliteOpenHelper的子类用于进行数据库的增删改查操作

public class ShoppingItemDataopenHelper extends SQLiteOpenHelper {
    private Context mContext;
    private static final String CREATE_DATABASE="create table Shoppinglist("
            +"id integer primary key autoincrement,"
            +"namesOfItems text,"
            +"priceOfItems real)";
    public ShoppingItemDataopenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext=context;
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(CREATE_DATABASE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}
上一篇下一篇

猜你喜欢

热点阅读