android实现条目倒计时功能

网上对于这样的功能已经是泛滥成河了,但是最近遇到这样的一个需求,还是要值得我们学习一下,并将他记录下来。

布局文件:

<FrameLayout 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"
 tools:context="com.example.rui.demo.list_count_down.ListCountDownActivity">

 <android.support.v7.widget.RecyclerView
  android:id="@+id/rv_list_count_down"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

 </android.support.v7.widget.RecyclerView>
</FrameLayout>

Activity界面:

public class ListCountDownActivity extends AppCompatActivity {

 RecyclerView mRecyclerView;

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

 }

 private void initView() {
  mRecyclerView = (RecyclerView) findViewById(R.id.rv_list_count_down);
  mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
  CountDownAdapter adapter = new CountDownAdapter();
  mRecyclerView.setAdapter(adapter);
  List<DataInfo> list = new ArrayList<>();
  for (int i = 1; i < 101; i++) {
   list.add(new DataInfo("我是条目" + i, i * 100));
  }
  adapter.setmDatas(list);
 }
}

倒计时条目适配器:

/**
 * @Date 2018/4/26
 * @Introduction 倒计时条目适配器
 */

public class CountDownAdapter extends RecyclerView.Adapter<CountDownAdapter.MyViewHoder> {

 private final String TAG = CountDownAdapter.class.getSimpleName();

 private final int STOP = 0x01;
 private final int START = 0x02;
 private final int LOOP = 0x03;

 private List<DataInfo> mDatas;

 public CountDownAdapter() {
 }

 public void setmDatas(List<DataInfo> mDatas) {
  this.mDatas = mDatas;
  notifyDataSetChanged();
 }

 @Override
 public MyViewHoder onCreateViewHolder(ViewGroup parent, int viewType) {
  return new MyViewHoder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_count_down, parent, false));
 }

 @Override
 public void onBindViewHolder(final MyViewHoder holder, int position) {
  final DataInfo info = mDatas.get(position);
  holder.tvName.setText(info.getName());
  holder.tvTime.setText(info.getTime() + "");
  if (info.isCountDown()) {
   holder.btnStart.setText("停止");
  } else {
   holder.btnStart.setText("开始");
  }
  holder.btnStart.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View view) {
    Message msg = Message.obtain();
    if (!info.isCountDown()) {
     holder.btnStart.setText("停止");
     msg.what = START;
    } else {
     holder.btnStart.setText("开始");
     msg.what = STOP;
    }
    msg.obj = info;
    mHandler.sendMessage(msg);
    info.setCountDown(!info.isCountDown());
   }
  });
 }

 @Override
 public int getItemCount() {
  return mDatas == null ? 0 : mDatas.size();
 }

 static class MyViewHoder extends RecyclerView.ViewHolder {

  private final TextView tvName;
  private final TextView tvTime;
  private final Button btnStart;

  public MyViewHoder(View itemView) {
   super(itemView);
   tvName = (TextView) itemView.findViewById(R.id.tv_name_count_down_item);
   tvTime = (TextView) itemView.findViewById(R.id.tv_time_count_down_item);
   btnStart = (Button) itemView.findViewById(R.id.btn_time_count_down_item);
  }
 }

 private Handler mHandler = new Handler() {

  private List<DataInfo> mCountDownList = new ArrayList<>();

  @Override
  public void handleMessage(Message msg) {
   setChange(msg);
  }

  private synchronized void setChange(Message msg) {
   switch (msg.what) {
    case STOP:
     DataInfo stopInfo = (DataInfo) msg.obj;
     Log.e(TAG, "------------stop:" + stopInfo.getName());
     mCountDownList.remove(stopInfo);
     notifyDataSetChanged();
     if (mCountDownList.size() <= 0) {
      mHandler.removeCallbacksAndMessages(null);
     }
     break;
    case START:
     DataInfo startInfo = (DataInfo) msg.obj;
     Log.e(TAG, "------------start:" + startInfo.getName());
     if (startInfo.getTime() > 0) {
      mCountDownList.add(startInfo);
      mHandler.sendEmptyMessageDelayed(LOOP, 1000);
     }
     break;
    case LOOP:
     if (mCountDownList.size() <= 0) {
      return;
     }
     for (Iterator<DataInfo> iterator = mCountDownList.iterator(); iterator.hasNext(); ) {
      DataInfo dataInfo = iterator.next();
      int time = dataInfo.getTime();
      time--;
      dataInfo.setTime(time);
      if (time <= 0) {
       iterator.remove();
      }
     }
     notifyDataSetChanged();
     mHandler.removeCallbacksAndMessages(null);
     mHandler.sendEmptyMessageDelayed(LOOP, 1000);
     break;
    default:
     break;
   }
  }
 };
}

JavaBean类

/**
 * @Date 2018/4/26
 * @Introduction 倒计时数据实体类
 */

public class DataInfo {
 private String name;
 private int time;
 private boolean isCountDown = false;

 public DataInfo(String name, int time) {
  this.name = name;
  this.time = time;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getTime() {
  return time;
 }

 public void setTime(int time) {
  this.time = time;
 }

 public boolean isCountDown() {
  return isCountDown;
 }

 public void setCountDown(boolean countDown) {
  isCountDown = countDown;
 }
}

以上就是条目中倒计时的一个小Demo。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • android特卖列表倒计时卡顿问题的解决方法

    在Android的开发中,我们经常遇见倒计时的操作,通常使用Timer和Handler共同操作来完成.当然也可以使用Android系统控件CountDownTimer,这里我们封装成一个控件,也方便大家的使用. 首先上一张效果图吧: 说一下造成卡顿的原因,由于滑动的时候,adapter的getView频繁的创建和销毁,就会出现卡顿和数据错位问题,那么我们每一个item的倒计时就需要单独维护,这里我用的Handler与timer及TimerTask结合的方法,我们知道TimerTask运行在自己子

  • Android利用RecyclerView实现列表倒计时效果

    最近面试时,面试官问了一个列表倒计时效果如何实现,现在记录一下. 运行效果图 实现思路 实现方法主要有两个: 1.为每个开始倒计时的item启动一个定时器,再做更新item处理: 2.只启动一个定时器,然后遍历数据,再做再做更新item处理. 经过思考,包括性能.实现等方面,决定使用第2种方式实现. 实现过程 数据实体 /** * 总共的倒计时的时间(结束时间-开始时间),单位:毫秒 * 例: 2019-02-23 11:00:30 与 2019-02-23 11:00:00 之间的相差的毫秒数

  • Android仿Keep运动休息倒计时圆形控件

    仿Keep运动休息倒计时控件,供大家参考,具体内容如下 源码 控件本身非常非常简单,唯一难点在于倒计时期间动态增减时长,如果说动态增减时长是瞬间完成的,倒也没什么难度,但是如果是需要花一定时间做动画的话(见效果图),考虑的逻辑就变多了,这也是我写这个的目的,对应源码中就是plus这个方法.地址: KeepCountdownView 效果 使用方法 xml: <com.KeepCountdownView.KeepCountdownView android:id="@+id/keep1&quo

  • Android实现计时与倒计时的常用方法小结

    本文实例总结了Android实现计时与倒计时的常用方法.分享给大家供大家参考,具体如下: 方法一 Timer与TimerTask(Java实现) public class timerTask extends Activity{ private int recLen = 11; private TextView txtView; Timer timer = new Timer(); public void onCreate(Bundle savedInstanceState){ super.onC

  • android实现倒计时功能代码

    效果图,每隔1秒,变换一下时间  xml: 复制代码 代码如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="mat

  • Android倒计时的开始与停止 剩余时分秒的展示

    本文实例为大家分享了Android倒计时的开始与停止,剩余时分秒的展示效果,供大家参考,具体内容如下 1.声明开启倒计时相关方法 Handler handler = new Handler(); Runnable update_thread = new Runnable() { @Override public void run() { leftTime--; LogUtil.e("leftTime="+leftTime); if (leftTime > 0) { //倒计时效果

  • Android自定义圆环倒计时控件

    本文实例为大家分享了Android自定义圆环倒计时控件的具体代码,供大家参考,具体内容如下 先来一张最终效果图: 主要思路: 在画渐变色圆环的时候,设置一个属性动画,根据属性动画的执行时长,来作为倒计时的时长.监听属性动画的进度,来达到 倒计时的目的. 二话不说,直接贴代码.具体实现思路都在注释上. 自定义属性: <declare-styleable name="CountDownProgressBar"> <attr name="countDown_cir

  • android自定义倒计时控件示例

    自定义TextView控件TimeTextView代码: 复制代码 代码如下: import android.content.Context;import android.content.res.TypedArray;import android.graphics.Paint;import android.text.Html;import android.util.AttributeSet;import android.widget.TextView; import com.new0315.R;

  • Android倒计时控件 Splash界面5秒自动跳转

    现在很多app的首页都有一个倒计时控件,比如说3秒或者5秒自动跳转界面,或者点击控件直接跳过 首先,自定义控件CircleProgressbar(参考网上资料) package com.zhoujian.mykeep.view; import android.annotation.TargetApi; import android.content.Context; import android.content.res.ColorStateList; import android.content.

  • Android实现加载广告图片和倒计时的开屏布局

    这是一个android开屏布局的实例,可以用于加载广告图片和倒计时的布局.程序中设置的LayoutParams,划分额外空间比例为6分之5,具体权重比例可根据用户自己需求来自定义,异步加载广告图片,相关的Android代码. 具体实现代码如下: package cn.waps.extend; import android.app.Activity; import android.content.Context; import android.content.res.Configuration;

随机推荐