韦德国际bv1946_www.bv1946com_韦德国际1946手机版
做最好的网站

需要注意的地方也没多少

日期:2020-03-17编辑作者:韦德国际bv1946计算机

在很多时候我们会用到一个场景,在 list 的 item 上显示不同的倒计时,如下图所示。

图片 1listView效果

需要注意的地方也没多少:

1.ViewHolder 的重复使用与倒计时显示冲突。2.退出应用时释放所有 CountDownTimer 资源。

关于使用 Android 用 RecyclerView 实现倒计时列表功能。

public static class MyAdapter extends BaseAdapter { private List<TimerItem> mDatas; private Context mContext; //用于退出 Activity,避免 Countdown,造成资源浪费。 private SparseArray<CountDownTimer> countDownCounters; public MyAdapter(Context mContext, List<TimerItem> mDatas) { this.mContext = mContext; this.mDatas = mDatas; this.countDownCounters = new SparseArray<>(); } /** * 清空当前 CountTimeDown 资源 */ public void cancelAllTimers() { if (countDownCounters == null) { return; } Log.e("TAG", "size : "   countDownCounters.size; for (int i = 0, length = countDownCounters.size(); i < length; i  ) { CountDownTimer cdt = countDownCounters.get(countDownCounters.keyAt; if (cdt != null) { cdt.cancel(); } } } @Override public int getCount() { if (mDatas != null && !mDatas.isEmpty { return mDatas.size(); } return 0; } @Override public Object getItem(int position) { if (mDatas != null && !mDatas.isEmpty { return mDatas.get; } return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder viewHolder; if (convertView == null) { convertView = LayoutInflater.from.inflate(R.layout.list_item_common, parent, false); viewHolder = new ViewHolder(); viewHolder.statusTv =  convertView.findViewById(R.id.tv_status); viewHolder.timeTv =  convertView.findViewById(R.id.tv_time); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } final TimerItem data = mDatas.get; viewHolder.statusTv.setText(data.name); CountDownTimer countDownTimer = countDownCounters.get(viewHolder.timeTv.hashCode; if (countDownTimer != null) { //将复用的倒计时清除 countDownTimer.cancel(); } long timer = data.expirationTime; timer = timer - System.currentTimeMillis(); //expirationTime 与系统时间做比较,timer 小于零,则此时倒计时已经结束。 if (timer > 0) { countDownTimer = new CountDownTimer(timer, 1000) { public void onTick(long millisUntilFinished) { viewHolder.timeTv.setText(TimeTools.getCountTimeByLong(millisUntilFinished)); Log.e("TAG", data.name   " : "   millisUntilFinished); } public void onFinish() { viewHolder.timeTv.setText("00:00:00"); viewHolder.statusTv.setText(data.name   ":结束"); } }.start(); //将此 countDownTimer 放入list. countDownCounters.put(viewHolder.timeTv.hashCode(), countDownTimer); } else { viewHolder.timeTv.setText("00:00:00"); viewHolder.statusTv.setText(data.name   ":结束"); } return convertView; } public class ViewHolder { public TextView statusTv; public TextView timeTv; }}

主要通过 SparseArray<CountDownTimer> 类保存每个 Item 上的 CountDownTimer 类。当需要复用时,通用 TextView 的 hashCode 取出对应的 CountDownTimer。重新启动并显示。当退出此页面时,调用 cancelAllTimers() 方法,遍历 countDownCounters 关闭所有的 CountDownTimer 类。避免造成内存泄漏。

mAdapter = new MyAdapter(mContext,TimerItemUtil.getTimerItemList;mListView.setAdapter;

public class TimerItem { //其他属性 public String name; //倒计时长,单位毫秒 public long expirationTime; public TimerItem(String name, long expirationTime) { this.name = name; this.expirationTime = expirationTime; }}

public static List<TimerItem> getTimerItemList() { List<TimerItem> lstTimerItems = new ArrayList<>(); lstTimerItems.add(new TimerItem("A", System.currentTimeMillis()   11 * 1000)); lstTimerItems.add(new TimerItem("B", System.currentTimeMillis()   22 * 1000)); lstTimerItems.add(new TimerItem("C", System.currentTimeMillis()   26 * 1000)); lstTimerItems.add(new TimerItem("D", System.currentTimeMillis()   33 * 1000)); lstTimerItems.add(new TimerItem("E", System.currentTimeMillis()   24 * 1000)); lstTimerItems.add(new TimerItem("F", System.currentTimeMillis()   98 * 1000)); lstTimerItems.add(new TimerItem("G", System.currentTimeMillis()   14 * 1000)); lstTimerItems.add(new TimerItem("H", System.currentTimeMillis()   36 * 1000)); lstTimerItems.add(new TimerItem("I", System.currentTimeMillis()   58 * 1000)); lstTimerItems.add(new TimerItem("J", System.currentTimeMillis()   47 * 1000)); lstTimerItems.add(new TimerItem("K", System.currentTimeMillis()   66 * 1000)); lstTimerItems.add(new TimerItem("L", System.currentTimeMillis()   55 * 1000)); lstTimerItems.add(new TimerItem("M", System.currentTimeMillis()   62 * 1000)); lstTimerItems.add(new TimerItem("N", System.currentTimeMillis()   45 * 1000)); lstTimerItems.add(new TimerItem("O", System.currentTimeMillis()   14 * 1000)); return lstTimerItems;}

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="64dp" android:orientation="horizontal" android:padding="10dp"> <TextView android: android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" tools:text="status" android:layout_gravity="center" android:gravity="center" /> <TextView android: android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="15sp" android:layout_gravity="center_vertical" tools:text="00:01:54"/></LinearLayout>

@Overrideprotected void onDestroy() { super.onDestroy(); if (mAdapter != null) { mAdapter.cancelAllTimers(); }}

本文由韦德国际bv1946手机版发布于韦德国际bv1946计算机,转载请注明出处:需要注意的地方也没多少

关键词: 倒计时 功能 列表

这就是一个完美的导入功能了

 1.无论是那个框架的导入,其实都是一样的原理的,但是首先我们要导入包,可能就这点不同。 kohana的导入包的方法...

详细>>

添加角色和功能

今天想要对Windows Server 2012R2进行备份操作,发现在菜单里发现没有这个功能,看来只能添加了 1.打开服务器管理,点...

详细>>