-
ListView,GridView等列表控件中批量进行CountDownTimer操作
-
对于CountDownTimer的使用都比较熟悉了。他一般用于(获取验证码等)倒计时。这个单个的他是很配合的。
但是让CountDownTimer团队协助的时候,感觉就有点悬乎了。在ListView和Gridview等列表控件中Item中使用CountDownTimer时会出现一些问题,比如控件滑动吃了、卡屏、文本信息紊乱(闪烁)等。 -
那么问题出现的原因在哪:
在item中实例化CountDownTimer对象比较消耗内存,影响性能。
对于实例化的CountDownTimer没法把控。 -
解决思路是:
在解决之前,分析一下实现的原理。
实现原理:其实实现批量倒计时的原来就是定时的刷新Listview等控件Item的倒计时文本的显示,让客户感觉倒计时是变动的,并起到提醒的效果。 -
实现的思路:
可以根据上面的原理来实现,在Android用来实现定时功能的也不是有CountDownTimer、Handler等。其实他们两都可以实现ListView中批量倒计时的效果。
-
下图是实现的效果图
布局activity_listview.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".Activity.MainActivity">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
适配器MyAdapter.java
public class MyAdapter extends BaseAdapter {
private static DateFormat dateFormat;
private String tag;
private long timeStamp;
private Context mContext;
public MyAdapter(Context context,String tag,long timeStamp){
this.tag =tag;
this.timeStamp = timeStamp;
mContext = context;
dateFormat = DateFormat.getTimeInstance();
}
@Override
public int getCount() {
return 60;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(null ==convertView){
viewHolder = new ViewHolder();
convertView = View.inflate(mContext, R.layout.itrm_list_grid_view,null);
viewHolder.title = (TextView) convertView.findViewById(R.id.title);
viewHolder.desc = (TextView) convertView.findViewById(R.id.desc);
convertView.setTag(viewHolder);
}else {
viewHolder = (ViewHolder)convertView.getTag();
}
// 倒计时和这个一样这里为了方便起见(模拟倒计时)
long between = (timeStamp-System.currentTimeMillis() - (3600*position*1000)-(position*60*1000)-(position*1000))/ 1000;//秒
long day = between / (24 * 3600);
long hour = between % (24 * 3600) / 3600;
long minute = between % 3600 / 60;
long second = between % 60 ;
viewHolder.title.setText(tag+" item "+position);
viewHolder.desc.setText("倒计时:"+fomatData(day)+"天"+fomatData(hour)+"时"+fomatData(minute)+"分"+fomatData(second)+"秒");
return convertView;
}
class ViewHolder{
TextView title ,desc;
}
private String fomatData(long l){
return String.format("%02d",l);
}
}
Activity SimpleActivity.java
public class SimpleActivity extends AppCompatActivity {
private ListView mListView;
private static String TAG;
public long timeStamp;
public CountDownTimer countDownTimer;
public MyAdapter mMyAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview);
mListView = (ListView) findViewById(R.id.listview);
TAG = getClass().getSimpleName();
timeStamp = System.currentTimeMillis()+(3600*1000*24*3);
mMyAdapter = new MyAdapter(this, TAG,timeStamp);
mListView.setAdapter(mMyAdapter);
countDownTimer = new CountDownTimer(1000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
mMyAdapter.notifyDataSetChanged();
this.start();
}
};
}
@Override
protected void onResume() {
super.onResume();
countDownTimer.start();
}
@Override
protected void onPause() {
super.onPause();
countDownTimer.cancel();
}
}
Handler来实现以及Gridview等中的应用可以下载Demo看效果
Demo下载地址