ListView,GridView等列表控件中CountDownTimer的应用

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下载地址

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值