[lottery] 04_购彩大厅(三)

Android 4.0

购彩大厅(三)

l1、水平切换处理(ViewPager
l基本用法(单独建立项目演示)
①在layout中添加相应配置信息<android.support.v4.view.ViewPager
        android:id="@+id/ii_viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
②创建PagerAdapter,必须处理四个方法
instantiateItem(ViewGroup, int)
destroyItem(ViewGroup, int, Object)
getCount()
isViewFromObject(View, Object)
③添加标题和下划线
系统默认实现方式:通过PagerAdaptergetPageTitle方法处理标题内容,使用PagerTabStrip处理下划线
注意PagerTabStrip的添加,需要包含在ViewPager
2、android:scaleType="matrix"的属性
有fitXY:填充xy轴
fitStart 填充开始
matrix:按矩阵填充
详细参数见:AndroidBox0.5.rar
<!-- 下划线 -->
<ImageView
    android:id="@+id/iv_category_selector_zl"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:scaleType="matrix"
    android:src="@drawable/id_category_selector"
    tools:ignore="ContentDescription" />
如何让下划线在中间填充呢?
l
1、布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <!-- 活动列表入口(广告) -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/zd_id_item_bg"
        android:clickable="true"
        android:focusable="true"
        android:gravity="center_vertical" >
        <ImageView
            android:id="@+id/iv_bell_zl"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dip"
            android:src="@drawable/id_bell"
            tools:ignore="ContentDescription" />
        <TextView
            android:id="@+id/tv_purchase_activity_title_zl"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="5dip"
            android:layout_marginLeft="4dip"
            android:layout_marginTop="5dip"
            android:text="@string/is_ssq_default_notice"
            android:textColor="@android:color/black" />
    </LinearLayout>
    <!-- 标题: -->
    <LinearLayout
        android:id="@+id/ll_lottery_category_zl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
        <TextView
            android:id="@+id/tv_category_fc_zl"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:gravity="center_horizontal"
            android:text="@string/is_category_fc"
            android:textColor="@android:color/black"
            android:textSize="18sp" />
        <TextView
            android:id="@+id/tv_category_tc_zl"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:gravity="center_horizontal"
            android:text="@string/is_category_tc"
            android:textColor="@android:color/black"
            android:textSize="18sp" />
        <TextView
            android:id="@+id/tv_category_gpc_zl"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:gravity="center_horizontal"
            android:text="@string/is_category_gpc"
            android:textColor="@android:color/black"
            android:textSize="18sp" />
    </LinearLayout>
    <!-- 下划线 scaleType属性-->
    
    <ImageView
        android:id="@+id/iv_category_selector_zl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scaleType="matrix"
        android:src="@drawable/id_category_selector"
        tools:ignore="ContentDescription" />
    <!-- ViewPager -->
    <android.support.v4.view.ViewPager
        android:id="@+id/vp_category_hall_zl"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </android.support.v4.view.ViewPager>
</LinearLayout>
2、核心代码:
package cn.zengfansheng.lottery.view;
 
import java.util.ArrayList;
import java.util.List;
 
import org.apache.commons.lang3.StringUtils;
 
import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import cn.zengfansheng.lottery.ConstantValue;
import cn.zengfansheng.lottery.R;
import cn.zengfansheng.lottery.engine.CommonInfoEngine;
import cn.zengfansheng.lottery.factory.EngineFactory;
import cn.zengfansheng.lottery.net.protocol.Message;
import cn.zengfansheng.lottery.net.protocol.Olement;
import cn.zengfansheng.lottery.net.protocol.element.CurrentIssueElement;
import cn.zengfansheng.lottery.util.LogUtil;
import cn.zengfansheng.lottery.util.PromptManager;
 
public class HallView extends BaseView {
 
    // *****************属性声明*******************//
    private static final String TAG = "HallView";
 
    // 资源信息
    private static final int[] LOGORESIDS =  { R.drawable.id_ssq, R.drawable.id_3d, R.drawable.id_qlc };
 
    private static final int[] TITLERESIDS =   { R.string.is_hall_ssq_title, R.string.is_hall_3d_title, R.string.is_hall_qlc_title };
 
    // 方案一: 存储服务器返回当期销售期信息
    // private Map<Integer, String> data;
 
    // 方案二:将每个彩种的用于展示当前销售期信息的TextView的引用,放入该集合
    // private List<TextView> tvLotterySummary;
 
    // *****************构造方法*******************//
    public HallView(Context context) {
        super(context);
    }
 
    // ********************ViewPager和PagerAdapter****************//
 
    private final static String[] TITLES = new String[] { "福彩", "体彩", "高频彩" };
    // ViewPager
    private ViewPager vpViewPager;
    // ViewPagerAdapter适配器
    private MyPagetAdapter myPagetAdapter;
 
    // 中间显示的内容
    private List<View> views;
 
    //adapter
    private class MyPagetAdapter extends PagerAdapter{
        @Override
        public int getCount() {
            return TITLES.length;
        }
 
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }
 
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
 
            View view = views.get(position);
            container.addView(view);
            return view;
        }
 
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView(views.get(position));
        }
    }
 
    /**
     * ViewPager的初始化工作
     */

    public void initViewPager() {
 
        // 查找ViewPager
        vpViewPager = (ViewPager) this.findViewById(R.id.vp_category_hall_zl);
 
        // 设置ViewPager的数据适配器
        myPagetAdapter = new MyPagetAdapter();
        vpViewPager.setAdapter(myPagetAdapter);
 
        vpViewPager.addView(categoryList);
        // listViews.add(categoryList);
 
    }
 
    /**
     * 初始化ViewPager要显示的内容
     */

    public void initViews(){
        //
        views = new ArrayList<View>();
        views.add(categoryList);
 
        TextView tv = new TextView(context);
 
        tv.setText("测试内容一");
        views.add(tv);
 
        tv = new TextView(context);
 
        tv.setText("测试内容二");
        views.add(tv);
    }
 
    // ********************ListView和ViewHolder****************//
    // listview
    private ListView categoryList;
    //adapter
    private LotteryAdapter lotteryAdapter;
 
    private static class ViewHolder {
        private ImageView ivHallLotteryLogo;// 彩种Logo
        private TextView tvHallLotteryTitle;// 彩种Title
        private TextView tvHallLotterySummary;// 概要信息
        private ImageView ivHallLotteryBet;// 投注
    }
 
    private class LotteryAdapter extends BaseAdapter{
 
//        private  int[] LOGORESIDS =  { R.drawable.id_ssq, R.drawable.id_3d, R.drawable.id_qlc };
//        private  int[] TITLERESIDS =   { R.string.is_hall_ssq_title, R.string.is_hall_3d_title, R.string.is_hall_qlc_title };
 
        @Override
        public int getCount() {
            return LOGORESIDS.length;// FIXME:这里logoResIds如果不做成静态的或者不放在LotteryAdapter中,那么将获取不到这个数组的长度。
        }
        @Override
        public Object getItem(int position) {
            return null;
        }
        @Override
        public long getItemId(int position) {
            return position;
        }
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
 
            LogUtil.i(TAG, "getView");
            View view = null;
            ViewHolder viewHolder = null;
            if (convertView != null && convertView instanceof LinearLayout) {
                view = convertView;
                viewHolder = (ViewHolder) view.getTag();
            } else {
 
                view = View.inflate(context, R.layout.zl_hall_lottery_item, null);
 
                viewHolder = new ViewHolder();
                viewHolder.ivHallLotteryLogo = (ImageView) view.findViewById(R.id.iv_hall_lottery_logo_zl);
                viewHolder.tvHallLotteryTitle = (TextView) view.findViewById(R.id.tv_hall_lottery_title_zl);
                viewHolder.tvHallLotterySummary = (TextView) view.findViewById(R.id.tv_hall_lottery_summary_zl);
                viewHolder.ivHallLotteryBet = (ImageView) view.findViewById(R.id.iv_hall_lottery_bet_zl);
 
                // 方案二:保存每一个需要变动的内容:tvHallLotterySummary
                // tvLotterySummary.add(viewHolder.tvHallLotterySummary);
 
                // 方案三:
                viewHolder.tvHallLotterySummary.setTag(position);// tag的用法二:唯一的标示一个控件
 
                view.setTag(viewHolder);// tag的用法一:存储数据
            }
 
            // logo
            viewHolder.ivHallLotteryLogo.setImageResource(LOGORESIDS[position]);
            // title
            viewHolder.tvHallLotteryTitle.setText(TITLERESIDS[position]);
 
            // 方案一:保存当前销售期信息到map
            //String info = data.get(position);
            //if (StringUtils.isNotBlank(info)) {
            //    viewHolder.tvHallLotterySummary.setText(info);
            //}
 
            viewHolder.ivHallLotteryBet.setOnClickListener(new OnClickListener() {
 
                @Override
                public void onClick(View v) {
                    switch (position) {
                            case 0:// 双色球
                                    // TODO: 双色球投注bet
 
                        break;
                        }
                    }
            });
            return view;
        }
    }
 
    /**
     * 初始化ListView
     */

    public void initListView(){
        // 1、showView
        showView = (ViewGroup) View.inflate(context, R.layout.zl_hall, null);
 
        // 2、listview初始化
        //categoryList = (ListView) showView.findViewById(R.id.lv_category_selector);
 
        // 由于ListView是加载到ViewPager中,所有不能findViewById了
        categoryList = new ListView(context);
 
        // 方案一:存储当前销售期信息(不变的内容也刷新,耗费资源,卡顿)
        // data = new HashMap<Integer, String>();
 
        // 方案二:保存要改变的TextView的引用(需要手动在ListView集合中维护一个List集合)
        // tvLotterySummary = new ArrayList<TextView>();
 
        // 3、adapter初始化
        lotteryAdapter = new LotteryAdapter();
 
        // 4、设置adapter
        categoryList.setAdapter(lotteryAdapter);
    }
 
    // ********************初始化购物大厅组件init()****************//
    /**
     * 1、初始化购物大厅组件
     */

    public void init() {
 
        // 初始化ListView
        initListView();
 
        // 初始化ViewPager
        initViewPager();
 
        // 初始化ViewPager中显示的内容
        initViews();
    }
 
    // ********************设置监听****************//
    @Override
    public void setListener() {
    }
    @Override
    public void onResume() {
        getCurrentIssueInfo();
    }
    @Override
    public int getViewId() {
        return ConstantValue.VIEW_HALL;
    }
 
    // **************************修改界面的提示信息****************************//
 
    /**
     * 修改界面的提示信息
     *
     * @param element
     */

    private void changeNotice(CurrentIssueElement element) {
 
        String info = context.getResources().getString(
                R.string.is_hall_common_summary);
 
        // 当前期次
        String issue = element.getIssue();
        // 剩余投注时间
        String lasttime = element.getLasttime();
 
        info = StringUtils.replaceEach(info, new String[] { "ISSUE", "TIME" },
                new String[] { issue, getLasttime(lasttime) });
 
        // 方案一:将从服务器获取到的数据存储到Map<Integer,String>
        // data中(存储当前销售期信息(不变的内容也刷新,耗费资源,卡顿))
        // 方案一问题:每次获取数据都会刷新一下listview的item,但有的东西不需要变化
        // data.put(0, info);
        // adapter.notifyDataSetChanged();// 让每一个listview的item刷新一下
 
        // 方案二:现在listview中需要改变的只有textview中的内容,阶段只需要更新TextView的显示内容,与item其他空间没有关系
        // 解决:创建一个集合在getView向集合添加TextView的引用
        // 方案二问题:ListView需要维护一个List集合
        // TextView tvSummery = tvLotterySummary.get(0);
        // tvSummery.setText(info);
 
        // 方案三:tag
        TextView tvSummery = (TextView) categoryList.findViewWithTag(0);// 将对应位置的组件取出来
        tvSummery.setText(info);
 
        // note:什么时候用notifyDataSetChanged(),什么时候用findViewWithTag()?
        // ①当ListView中需要进行增删item时候notifyDataSetChanged();
        // ②当需要更新Item中信息时候,一般使用优化的方式完成,
        // ③扩展:ListView懒加载,ListView滚动的时候不加载数据(不往item添加数据),在停下来的时候加载数据
 
    }
 
    // ********************************异步的从服务器上获取数据************************************//
    /**
     * 获取当前销售期信息(从服务器上获取最新数据)
     */

    public void getCurrentIssueInfo(){
 
        // 优化3:使用已有AsyncTask类进行数据的获取,将其丢到BaseView中
        new MyHttpAsyncTask<Integer>() {
 
            @Override
            protected Message doInBackground(Integer... params) {
 
                // 1、获取业务的对象(用工厂类来获取)
                CommonInfoEngine infoEngine = EngineFactory.getEngineImplInstance(CommonInfoEngine.class);
                // 2、执行相应的方法
                Message message = infoEngine.getCurrentIssueInfo(params[0]);
                return message;
            }
            @Override
            protected void onPostExecute(Message result) {
                super.onPostExecute(result);
                // 界面的展示
                if (result != null) {// 从服务器上获取的message不为null
                    Olement olement = result.getBody().getOlement();
                    if (0 == (olement.getErrorcode())) {// 服务器返回正确,为0
                        CurrentIssueElement element = (CurrentIssueElement) result.getBody().getElements().get(0);
                        changeNotice(element);
                    } else {// 服务器返回不正确
                        PromptManager.showToast(context, olement.getErrormsg());
                    }
                } else {// 没有拿到数据
                    PromptManager.showToast(context, "您好,服务器繁忙,请稍后再试!");
                }
            }
        }.executeProxy(ConstantValue.SSQ);
    }
 
    // ********************************将秒时间转换成日时分格式************************************//
    /**
     * 将秒时间转换成日时分格式
     *
     * @param lasttime
     * @return
     */

    public String getLasttime(String lasttime) {
        StringBuffer result = new StringBuffer();
        if (StringUtils.isNumericSpace(lasttime)) {
            int time = Integer.parseInt(lasttime);
            int day = time / (24 * 60 * 60);
            result.append(day).append("天");
            if (day > 0) {
                time = time - day * 24 * 60 * 60;
            }
            int hour = time / 3600;
            result.append(hour).append("时");
            if (hour > 0) {
                time = time - hour * 60 * 60;
            }
            int minute = time / 60;
            result.append(minute).append("分");
        }
        return result.toString();
    }
}
3、效果: