android客户端学习-用listview显示秒杀列表

来源:互联网 发布:淘宝的每日好店 编辑:程序博客网 时间:2024/06/03 17:37
目前程序中有在商品列表的每一项中显示秒杀倒计时,就是秒杀专场,在做这个的过程中遇到一些问题,首先我在每一项中都增加了一个倒计时,粗看没有什么问题,但是一上拉刷新,所有倒计时显示都乱了,并且每一项中都增加倒计时,这对系统的损耗也也大,后来在网上找了各种方法,然后又多方验证和修改,最终可行。先说说原理1.用
List<Long> timeList 对象来保存列表中每一项剩余秒杀的秒数。2.每过一秒的时候List<Long> timeList中的每一项值减一。3.listview中的adapter每过一秒更新一下 4.adapter每次更新的时候因为有图片,每次更新图片会闪一下,所以在adapter中需要对图片进行判断,如果是原来的图片,则图片不再更新,这样就解决了每秒图片也会跟着闪一下的问题
下面是主要代码粘贴:
/** * 秒杀专场 */public class SeckillListActivity extends BaseActivity {    @ViewInject(R.id.sckill_list)    private PullToRefreshListView sckill_list;// list view 列表可下拉刷新    private int pageIndex;    private int pageSize;    private int pageCount;    private List<EMSeckillListItemVo> seckillList;// list 数据对象    private List<Long> timeList;// 保存每项秒杀列表剩余项    private SeckillAdapter seckillAdapter;    private Handler handler;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.seckill);        ViewUtils.inject(this);
        // "秒杀专场"        initView();        getSckillProducts();        initViewPartyList();    }    private void initView(){        pageIndex = 1;        pageSize = 10;        seckillList = new ArrayList<>();        timeList = new ArrayList<>();        seckillAdapter = new SeckillAdapter(SeckillListActivity.this,seckillList,timeList);        sckill_list.setAdapter(seckillAdapter);        emProductService = new EMProdcutServiceImpl();        emProductService.setCallBackListener(new CallBackListener() {            @Override            public void OnSuccess(SeckillListVo result) {                // 列表对象和timelist数据处理                // 只创建一个handler把控所有项,如果没有创建则创建,否则不用再创建,会定时更新                if (null == handler){                    handler = new Handler();                    handler.post(runnable);                }            }            @Override            public void OnFailure(ServiceException e) {                            }        });    }
// Runnable对象处理每秒timelist每项中值减一,并adapter更新final Runnable runnable = new Runnable() {        @Override        public void run() {            synchronized (this) {                for (int i=0;i<timeList.size();i++){                    if (timeList.get(i)>0){                        timeList.set(i,timeList.get(i)-1);                    }                }                seckillAdapter.notifyDataSetChanged();                handler.postDelayed(this, 1000);            }        }    };    private void initViewPartyList() {        sckill_list.setMode(PullToRefreshBase.Mode.PULL_FROM_END);        sckill_list.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {            @Override            public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {            }            @Override            public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {                if (pageIndex < pageCount) {                    pageIndex++;                    getSckillProducts();                } else {                    toast("已是最后一页");                    (new Thread(new Runnable() {                        @Override                        public void run() {                            Message msg = new Message();                            msg.what = pullToRefreshStop;                            myHandler.sendMessage(msg);                        }                    })).start();                }            }        });    }    private static final int pullToRefreshStop = 1234;    @SuppressLint("HandlerLeak")    private Handler myHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            // 执行接收到的通知,更新UI 此时执行的顺序是按照队列进行,即先进先出            super.handleMessage(msg);            switch (msg.what) {                case pullToRefreshStop:                    sckill_list.onRefreshComplete();                    break;            }        }    };    private void getSckillProducts(){        // 访问数据库获取数据    }    private class SeckillAdapter extends BaseAdapter {        private Context context;        private LayoutInflater layoutInflater;        private List<SeckillListItemVo> dataList;        private List<Long> timeList;        public SeckillAdapter(Context context, List<SeckillListItemVo> dataList, List<Long> timeList) {            this.context = context;            this.dataList = dataList;            this.timeList = timeList;            layoutInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);        }        @Override        public int getCount() {            return dataList.size();        }        @Override        public Object getItem(int i) {            return dataList.get(i);        }        @Override        public long getItemId(int i) {            return i;        }        @Override        public View getView(int position, View convertView, ViewGroup viewGroup) {            ViewHolder viewHolder = new ViewHolder();            if (null == convertView) {                convertView = layoutInflater.inflate(R.layout.em_seckill_item, viewGroup, false);                // viewholder中每一项进行初始化                convertView.setTag(viewHolder);            } else {                viewHolder = (ViewHolder) convertView.getTag();            }            final SeckillListItemVo itemVo = dataList.get(position);
            // 在adapter中需要对图片进行判断,如果是原来的图片,则图片不再更新            if (!itemVo.getItemImagePath().equals(viewHolder.em_seckill_img.getTag())){                bitmapUtils.display(viewHolder.em_seckill_img, itemVo.getItemImagePath());// 图片                viewHolder.em_seckill_img.setTag(itemVo.getItemImagePath());            }            GradientDrawable drawable = new GradientDrawable();            drawable.setCornerRadius(5f);            drawable.setShape(GradientDrawable.RECTANGLE); // 画框
            drawable.setStroke(1, ContextCompat.getColor(context, R.color.em_02)); // 边框粗细及颜色            drawable.setColor(ContextCompat.getColor(context, R.color.em_02)); // 边框内部颜色
 
            // 显示时分秒                List<String> temp = hourMinSecond(timeList.get(position));                viewHolder.em_seckill_hh.setText(temp.get(0));                viewHolder.em_seckill_mm.setText(temp.get(1));                viewHolder.em_seckill_ss.setText(temp.get(2));            }            return convertView;        }
       // time单位秒,如果是毫秒,则需要time/1000        private List<String> hourMinSecond(long time) {            List<String> temp = new ArrayList<>();            long hours = time / (60 * 60);            long min = ((time / 60) - hours * 60);            long second = (time - hours * 60 * 60 - min * 60);            String hourses = "";            if (hours > 999) {                hourses = "999";            } else {                hourses = EMHelperUtils.Lpad(2, hours);            }            String mins = EMHelperUtils.Lpad(2, min);            String seconds = EMHelperUtils.Lpad(2, second);            temp.add(hourses);            temp.add(mins);            temp.add(seconds);            return temp;        }        class ViewHolder {                    }    }}

原创粉丝点击