Android利用RecyclerView实现列表倒计时功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
创新互联-专业网站定制、快速模板网站建设、高性价比锡林郭勒盟网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式锡林郭勒盟网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖锡林郭勒盟地区。费用合理售后完善,十年实体公司更值得信赖。
实现思路
实现方法主要有两个:1.为每个开始倒计时的item启动一个定时器,再做更新item处理;2.只启动一个定时器,然后遍历数据,再做再做更新item处理。经过思考,包括性能、实现等方面,决定使用第2种方式实现。
实现过程
数据实体
/** * 总共的倒计时的时间(结束时间-开始时间),单位:毫秒 * 例: 2019-02-23 11:00:30 与 2019-02-23 11:00:00 之间的相差的毫秒数 */ private long totalTime; /** * 倒计时是否在暂停状态 */ private boolean isPause = true;
倒计时
Timer
mTimer.schedule(mTask, 0, 1000);
TimerTask
class MyTask extends TimerTask { @Override public void run() { if (mList.isEmpty()) { return; } int size = mList.size(); CountDownTimerBean bean; long totalTime; for (int i = 0; i < size; i++) { bean = mList.get(i); if (!bean.isPause()) {//不处于暂停状态 totalTime = bean.getTotalTime() - 1000; if (totalTime <= 0) { bean.setPause(true); bean.setTotalTime(0); } bean.setTotalTime(totalTime); Message message = mHandler.obtainMessage(1); message.arg1 = i; mHandler.sendMessage(message); } } } }
线程交互更新item
mHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: notifyItemChanged(msg.arg1, "update-time"); break; } } };
性能优化方面
1.调用notifyItemChanged()方法后,不要更新整个item(比如说item包含图片,不需要变的),所以要重写onBindViewHolder( Holder , int , List )方法:
@Override public void onBindViewHolder(@NonNull Holder holder, int position, @NonNull List
2.销毁资源操作:
/** * 销毁资源 */ public void destroy() { mHandler.removeMessages(1); if (mTimer != null) { mTimer.cancel(); mTimer.purge(); mTimer = null; } }
RecyclerView.Adapter部分源码
public class CountDownTimerAdapter extends RecyclerView.Adapter { private static final String TAG = "CountDownTimerAdapter->"; private List mList;//数据 private Handler mHandler;//线程调度,用来更新列表 private Timer mTimer; private MyTask mTask; public CountDownTimerAdapter() { mList = new ArrayList<>(); mHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: notifyItemChanged(msg.arg1, "update-time"); break; } } }; mTask = new MyTask(); } public void bindAdapterToRecyclerView(@NonNull RecyclerView view) { view.setAdapter(this); } /** * 设置新的数据源 * * @param list 数据 */ public void setNewData(@NonNull List list) { destroy(); mList.clear(); mList.addAll(list); notifyDataSetChanged(); if (mTimer == null) { mTimer = new Timer(); } mTimer.schedule(mTask, 0, 1000); } /** * 销毁资源 */ public void destroy() { mHandler.removeMessages(1); if (mTimer != null) { mTimer.cancel(); mTimer.purge(); mTimer = null; } } @NonNull @Override public Holder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_count_down_timer, viewGroup, false); return new Holder(view); } @Override public void onBindViewHolder(@NonNull Holder holder, int position, @NonNull List
关于Android利用RecyclerView实现列表倒计时功能问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。
分享文章:Android利用RecyclerView实现列表倒计时功能
文章路径:
http://cdxtjz.cn/article/pceshg.html