[lottery] 05_购物车

Android 4.0

购物车

1、接口暴露
用一个接口将部分逻辑类似的功能类的方法定义在接口中,
在实际的操作中,通过多态找到实际实现功能的类
2、布局文件-弹簧
两边固定,中间内容自动缩放
可以将中间的内容布局在上面部分的下面,在下面部分的上面
3、一个TextView中,不同文本中高亮显示
<string name="is_play_bottom_title">&#160;&#160;&#160;共&#160;NUM&#160;&#160;注&#160;&#160;&#160;MONEY&#160;&#160;元&#160;&#160;&#160;</string>
//&#160 代表空格
Spanned fromHtml = Html.fromHtml(notice);//public interface Spanned extends CharSequence
tvShoppingLotteryNotice.setText(fromHtml);
步骤:
需要处理的功能:
1、彩票的添加、删除
2、统计购物车中总价(注数)
3、生成机选号码
4、购物车内容显示控制
5、清空购物车
6、购买(判断用户登陆和余额)
l
核心代码:
package cn.zengfansheng.lottery.view;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
 
import org.apache.commons.lang3.StringUtils;
 
import android.content.Context;
import android.os.Bundle;
import android.text.Html;
import android.text.Spanned;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
import cn.zengfansheng.lottery.ConstantValue;
import cn.zengfansheng.lottery.GlobalParams;
import cn.zengfansheng.lottery.R;
import cn.zengfansheng.lottery.domain.ShoppingCart;
import cn.zengfansheng.lottery.domain.Ticket;
import cn.zengfansheng.lottery.util.PromptManager;
import cn.zengfansheng.lottery.view.manager.UIManager;
 
/**
* 购物车
*
* @author hacket
*/

public class ShoppingView extends BaseView {
 
    public ShoppingView(Context context, Bundle bundle) {
        super(context);
        this.bundle = bundle;
    }
 
    @Override
    protected void init() {
        // 购物车布局
        showView = (ViewGroup) View.inflate(context, R.layout.zl_shopping, null);
 
        // 购物车组件初始化
        initComponent();
 
        // ListView初始化
        setListView();
    }
 
    @Override
    protected void setListener() {
        // 设置监听
        setComponentListener();
    }
 
    @Override
    public int getViewId() {
        return ConstantValue.VIEW_SHOPPINGCART;
    }
 
    @Override
    public void onPause() {
        super.onPause();
    }
 
    // note*********************0、功能列表*********************
    // ①通用三步:布局,初始化,设置监听
    // ②购物车信息展示
    // ③添加自选、机选
    // ④清空列表
    // ⑤处理提示内容:TexeView(高亮处理)
    // ⑥购买
 
    // note*********************1-2、购物车组件的初始化*********************
    private Button btnAddOptional;// 添加自选号
    private Button btnAddRandom;// 添加机选号
    private ImageButton ibShoppingListClear;// 清空列表
    private TextView tvShoppingLotteryNotice;// 注数详细信息
    private Button btnLotteryShoppingBuy;// 购买
 
    /**
     * 初始化购物车组件
     */

    private void initComponent() {
 
        // 1、自选号、机选号
        btnAddOptional = (Button) findViewById(R.id.btn_add_optional);
        btnAddRandom = (Button) findViewById(R.id.btn_add_random);
 
        // 2、清空列表
        ibShoppingListClear = (ImageButton) findViewById(R.id.ib_shopping_list_clear);
 
        // 3、注数详细信息
        tvShoppingLotteryNotice = (TextView) findViewById(R.id.tv_shopping_lottery_notice);
 
        // 4、购买
        btnLotteryShoppingBuy = (Button) findViewById(R.id.btn_lottery_shopping_buy);
 
    }
 
    // note*********************1-3设置监听*********************
    /**
     * 设置组件监听事件
     */

    private void setComponentListener() {
 
        btnAddOptional.setOnClickListener(this);
        btnAddRandom.setOnClickListener(this);
        ibShoppingListClear.setOnClickListener(this);
        btnLotteryShoppingBuy.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_add_optional:// 自选票种注数
            // 也就是后退键的功能
            UIManager.getUiManager().history();
            changeShoppingCartNotice();
            break;
        case R.id.btn_add_random:// 机选一注票种
            addRandomTicket();
            changeShoppingCartNotice();
            break;
        case R.id.ib_shopping_list_clear:// 清空购物车
            clearTicketCart();
            changeShoppingCartNotice();
            break;
        case R.id.btn_lottery_shopping_buy:// :购买
            buyTicket();
            break;
        default:
 
            break;
        }
    }
 
    // note*********************2、购物车信息展示*********************
    private ListView lvShoppingList;// 购物车listview
    private ShopcartAdapter shopcartAdapter;// 购物车数据适配器
    private List<Ticket> tickets;// 票信息
 
    /**
     * 购物车listview初始化
     */

    public void setListView(){
 
        lvShoppingList = (ListView) findViewById(R.id.lv_shopping_list);
 
        tickets = ShoppingCart.getInstance().getTickets();
 
        shopcartAdapter = new ShopcartAdapter();
        lvShoppingList.setAdapter(shopcartAdapter);
 
    }
 
    /**
     * 购物车数据适配器
     *
     * @author hacket
     */

    private class ShopcartAdapter extends BaseAdapter {
 
        @Override
        public int getCount() {
            if (tickets != null) {
                return tickets.size();
            }
            return 0;
        }
 
        @Override
        public Object getItem(int position) {
            return tickets.get(position);// //
        }
 
        @Override
        public long getItemId(int position) {
            return position;
        }
 
        @Override
        public View getView(final int position, View convertView,
                ViewGroup parent) {
 
            ViewHolder holder = null;
            if (convertView==null) {
                convertView = View.inflate(context, R.layout.zl_shopping_row, null);
 
                holder = new ViewHolder();
 
                // 条目删除图标
                holder.ibItemDelete = (ImageButton) convertView.findViewById(R.id.ib_shopping_item_delete);
                // 红色球
                holder.tvItemRedBalls = (TextView) convertView.findViewById(R.id.tv_shopping_item_reds);
                // 蓝色球
                holder.tvItemBlueBall = (TextView) convertView.findViewById(R.id.tv_shopping_item_blues);
                // 一注价格
                holder.tvItemMoney = (TextView) convertView.findViewById(R.id.tv_shopping_item_money);
 
                convertView.setTag(holder);// store data
 
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
 
            // 红球
            holder.tvItemRedBalls.setText(tickets.get(position).getRedBall());
            // 蓝球
            holder.tvItemBlueBall.setText(tickets.get(position).getBlueBall());
            // 彩种的金额
            int noteNum = tickets.get(position).getNoteNum();// 注数
            holder.tvItemMoney.setText(noteNum + "注" + noteNum * 2 + "元");
 
            // 设置监听-删除当前选中的注数条目
            holder.ibItemDelete.setOnClickListener(new OnClickListener() {
 
                @Override
                public void onClick(View v) {
                    // 移除当前列表的一条记录
                    tickets.remove(position);
                    // 更新adapter数据
                    shopcartAdapter.notifyDataSetChanged();
                    // 更新文本提示
                    changeShoppingCartNotice();
                }
            });
 
            return convertView;
        }
 
    }
 
    /**
     * 购物车数据适配器的ViewHolder
     *
     * @author hacket
     */

    private static class ViewHolder {
        private ImageButton ibItemDelete;// 条目删除图标
        private TextView tvItemRedBalls;// 红色球
        private TextView tvItemBlueBall;// 蓝色球
        private TextView tvItemMoney;// 一注价格
    }
 
    // note*********************3、添加自选、机选*********************
    /**
     * 机选票种
     */

    private void addRandomTicket() {
        // 机选红球
        List<Integer> listRedSelected = new ArrayList<Integer>();
        Random random = new Random();
        while (listRedSelected.size() < 6) {
            int redBall = random.nextInt(33) + 1;// 不包含0,所以要加1
            if (listRedSelected.contains(redBall)) {// 如果包含了,那么continue
                continue;
            }
            // 更新adapter
            listRedSelected.add(redBall);
        }
        // 机选蓝球
        List<Integer> listBlueSelected = new ArrayList<Integer>();
        int blueBallNum = random.nextInt(16) + 1;// 不包含0,所以要加1
        listBlueSelected.add(blueBallNum);
 
        // 生成一注投注信息:封装到Ticket:红球、蓝球、注数
        Ticket ticket = new Ticket();
        // 3、封装成javabean(传递给购物车)
 
        // 3-1存红球
        StringBuffer sbRed = new StringBuffer();
        for (Integer redNum : listRedSelected) {
            // 诸如:[ 11 22 32 01 34 13 24]形式
            sbRed.append(" ").append(redNum);
            // 空格放前面,就可以不用考虑截取的end了
        }
        String redBall = sbRed.toString().substring(1);
        ticket.setRedBall(redBall);
 
        // 3-2存蓝球
        StringBuffer sbBlue = new StringBuffer();
        sbBlue.append(" ").append(listBlueSelected.get(0));
        String blueBall = sbBlue.toString().substring(1);
        ticket.setBlueBall(blueBall);
 
        // 3-3存注数
        ticket.setNoteNum(1);
 
        // 4、将封装的结果添加到购物车中: List<Ticket>
        // 由于购物车是公用的,所以内存中只有一份,所以用单例
        ShoppingCart cart = ShoppingCart.getInstance();
        cart.getTickets().add(ticket);
 
        // 设置当前期次
        cart.setIssue(bundle.getString("issue"));
        // 设置当前彩种的id
        cart.setLotteryId(ConstantValue.SSQ);
 
        // 更新数据适配器
        shopcartAdapter.notifyDataSetChanged();
    }
 
    // note*********************4、清空列表*********************
    /**
     * 清空购物车
     */

    private void clearTicketCart() {
        // 情况集合
        ShoppingCart.getInstance().getTickets().clear();
        // 更新adapter数据
        shopcartAdapter.notifyDataSetChanged();
    }
 
    // note*********************5、处理提示内容:TexeView(高亮处理)*********************
    // 界面切换过来的时候,更新提示内容文本
    @Override
    public void onResume() {
        super.onResume();
        changeShoppingCartNotice();
    }
 
    /**
     * 处理提示内容
     */

    public void changeShoppingCartNotice() {
        int total = 0;
        List<Ticket> tickets = ShoppingCart.getInstance().getTickets();
        for (Ticket ticket : tickets) {
            total += ticket.getNoteNum();
        }
        // 利用系统提供Html工具进行内容处理
        // 将处理的结果交给TextView展示
        // <![CDATA[注数:  <font
        // color="#ff0000">NUM</font>  注   金额:  <font
        // color="#ff0000">MONEY</font>  元]]>
        String notice = context.getResources().getString(R.string.is_shopping_list_betting_num);
        notice = StringUtils.replaceEach(notice, new String[]{"NUM","MONEY"}, new String[]{String.valueOf(total),String.valueOf(total*2)});
        Spanned fromHtml = Html.fromHtml(notice);//public interface Spanned extends CharSequence
        tvShoppingLotteryNotice.setText(fromHtml);
    }
 
    // note*********************6、购买*********************
    /**
     * 购买彩票
     */

    private void buyTicket() {
 
        // 1、是否选中了一注
        // 2、是否登录
        // 3、用户余额是否充足
 
        if (ShoppingCart.getInstance().getTickets().size() > 0) { // 1-1、大于一注
                                                                    // (判断:购物车集合的size)
 
            if (GlobalParams.isLogin) {// 2-1、用户已经登录(判断:用户是否登录了)
 
                if (GlobalParams.userBalance > Float.parseFloat(ShoppingCart //
                        .getInstance().getLotteryValue())) {// 3-1、余额大于所需要的资金(
                                                            // 判断:用户的余额是否满足投注的需求)
 
                    // TODO:追期和倍投
 
                    // 界面跳转:追期和倍投的设置界面
                    UIManager.getUiManager().changeView(PreBetView.class, bundle);
 
                } else {// 3-2、余额小于所需要的资金
                    // 判断三:提示,界面跳转---充值界面
                    PromptManager.showToast(context, "余额不足");
                }
 
            } else {// 2-2、用户未登录,跳转到用户登录界面
                // 判断二:提示,界面跳转---用户登录界面(①登录②获取余额)
                PromptManager.showToast(context, "用户未登录");
                UIManager.getUiManager().changeView(UserLogin.class, bundle);
                // 进行登录操作,余额取出,验证用户登录(异步任务),
            }
        } else {// 1-2、小于一注
            // 判断一:提示
            PromptManager.showToast(context, "请选择一注");
        }
    }
}
结果: