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 { } }}
阅读全文
0 0
- android客户端学习-用listview显示秒杀列表
- Android学习之ListView显示下拉列表
- android客户端学习-listview的列表点击事件
- Android-用ListView显示SDCard文件列表
- android用listView显示文件夹列表
- 学习使用ListView显示列表
- Android学习_19_采用ListView实现数据列表显示
- android学习:在ListView显示对象信息、侦听列表事件
- 用listview显示文件列表
- Android采用ListView实现数据列表显示
- Android采用ListView实现数据列表显示
- Android采用ListView实现数据列表显示
- android开发 列表显示(ListView)
- Android中使用ListView显示列表
- Android通过LIstView显示文件列表
- Android通过LIstView显示文件列表
- Android采用ListView实现数据列表显示
- Android采用ListView实现数据列表显示
- Gradle sync failed: Minimum supported Gradle version is 3.3. Current version is 2.14.1. If using the
- Python Flask 开发环境搭建(Windows)
- JS判断文件的大小
- 关于微软C#中的Chart图表控件的简单使用
- 位运算
- android客户端学习-用listview显示秒杀列表
- C++学习笔记--多重继承的问题
- Java多线程设计模式之Promise 模式
- 带你走进惯性导航
- QTableWidget用法小结
- C语言 --文件
- 在Eclipse中创建Web服务器
- 兼容中英文的字符截取
- centos7防火墙设置