android实现倒计时,最简单实现RecyclerView倒计时+SwipeRefreshLayout下拉刷新


先上效果图:


RecyclerView + SwipeRefreshLayout

实现倒计时效果

MainActivity.java

package top.wintp.counttimedemo1;

import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

/**
 * 类描述:主要的Activity
 * <p>
 * 作者:  你的感冒清
 * <p>
 * qq:  337081267
 * <p>
 * CSDN:    http://blog.csdn.net/pyfysf
 * <p>
 * 个人博客:    http://wintp.top
 * <p>
 * 时间:   17-5-18
 * <p>
 * 邮箱:  pyfysf@163.com
 */
public class MainActivity extends AppCompatActivity
        implements SwipeRefreshLayout.OnRefreshListener {

    private SwipeRefreshLayout mSwrl_refresh;
    private RecyclerView mRv_list;
    private List<CountTimeInfo> mCountTimeInfos;

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

        //初始化View
        initView();

    }

    /**
     * 初始化View
     */
    private void initView() {
        mSwrl_refresh = (SwipeRefreshLayout) findViewById(R.id.swrl_refresh);
        mRv_list = (RecyclerView) findViewById(R.id.rv_list);

        //设置下拉刷新的监听
        mSwrl_refresh.setOnRefreshListener(this);

        //获取数据
        getData2Local();
    }

    @Override
    public void onRefresh() {
        //刷新数据
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                mSwrl_refresh.setRefreshing(false);
                getData2Local();
            }
        },2000);
    }

    /**
     * 从本地加载数据
     * 可以从服务器端加载数据
     */
    public void getData2Local() {
        //创建本地集合装载数据
        mCountTimeInfos = new ArrayList<>();
        //添加数据
        for (int i = 0; i < 100; i++) {
            CountTimeInfo countTimeInfo = new CountTimeInfo();

            countTimeInfo.setContent("item内容" + i);
            countTimeInfo.setCreateTime(TimeUtils.getWebsiteDatetime() - ((i + 1) * 10));
            countTimeInfo.setNeedTime((i+1)*10);

            mCountTimeInfos.add(countTimeInfo);
        }

        //设置布局管理器
        LinearLayoutManager llm = new LinearLayoutManager(this);
        mRv_list.setLayoutManager(llm);

        //设置数据适配器
        mRv_list.setAdapter(new CountTimeListAdapter(this, mCountTimeInfos));

    }
}

activity_main.xml布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swrl_refresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

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

    </android.support.v4.widget.SwipeRefreshLayout>

</LinearLayout>

TimeUtil.java

package top.wintp.counttimedemo1;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

/**
 * 类描述: 时间的工具类
 *
 * 作者:  你的感冒清
 *
 * qq:  337081267
 *
 * CSDN:    http://blog.csdn.net/pyfysf
 *
 * 个人博客:    http://wintp.top
 *
 * 时间:   17-5-18
 *
 * 邮箱:  pyfysf@163.com
 */

public class TimeUtils {



    //时间格式转换
    public static String timeChange(String time) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = null;
        try {
            date = format.parse(time);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        SimpleDateFormat format1 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");
        String str = format1.format(date);
        return str;
    }

    public static long timeDifference(String nowtime, String endtime) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long diff = 0;
        try {
            //系统时间转化为Date形式
            Date dstart = format.parse(nowtime);
            //活动结束时间转化为Date形式
            Date dend = format.parse(endtime);
            //算出时间差,用ms表示
            diff = dend.getTime() - dstart.getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        //返回时间差
        return diff;
    }

    /**
     * 获取网络时间
     */
    public static Long getWebsiteDatetime() {
        SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        dff.setTimeZone(TimeZone.getTimeZone("GMT+08"));

        return stringToLongTime(dff.format(new Date()));
    }

    /**
     * 把String类型的事件转换为毫秒值 "yyyy-MM-dd HH:mm:ss"
     */
    public static Long stringToLongTime(String time) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        long millionSeconds = 0;//毫秒
        try {
            return millionSeconds = sdf.parse(time).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

    }

    /**
     * 把Long类型的毫秒值转换为
     *
     * @param counttime day天 HH时mm分ss秒
     * @return
     */
    public static String longToStringTime(long counttime) {
        long days = counttime / (1000 * 60 * 60 * 24);
        long hours = (counttime - days * (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);
        long minutes = (counttime - days * (1000 * 60 * 60 * 24) - hours * (1000 * 60 * 60)) / (1000 * 60);
        long second = (counttime - days * (1000 * 60 * 60 * 24) - hours * (1000 * 60 * 60) - minutes * (1000 * 60)) / 1000;


        return days + "天" + hours + "时" + minutes + "分" + second + "秒";

    }

}

item_count_time.xml

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="180dp"
    android:layout_margin="20dp"
    android:clickable="true"
    app:cardCornerRadius="10dp"
    >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="180dp"
        android:padding="15dp">


        <TextView
            android:id="@+id/tv_content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="4"
            android:gravity="center"
            android:text="内容条目"
            android:textColor="@android:color/holo_red_dark"
            android:textSize="20sp"
            />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:src="@mipmap/ic_launcher"/>

        <TextView
            android:id="@+id/tv_count_down_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_weight="4"
            android:text="2017-05-18 09:26:53"
            android:textColor="@android:color/holo_red_dark"
            android:textSize="17sp"
            />

    </RelativeLayout>

</android.support.v7.widget.CardView>


CountTimeAdapter.java

package top.wintp.counttimedemo1;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

/**
 * 作者:  你的感冒清
 * <p>
 * qq:  337081267
 * <p>
 * CSDN:    http://blog.csdn.net/pyfysf
 * <p>
 * 个人博客:    http://wintp.top
 * <p>
 * 时间:  17-5-18   上午9:19
 * <p>
 * 邮箱:  pyfysf@163.com
 */

class CountTimeListAdapter extends RecyclerView.Adapter {
    private final Context mContext;
    private LayoutInflater mLayoutInflater;
    private List<CountTimeInfo> mCountTimeInfos;

    public CountTimeListAdapter(Context context, List<CountTimeInfo> countTimeInfos) {
        mLayoutInflater = mLayoutInflater.from(context);
        this.mContext = context;
        this.mCountTimeInfos = countTimeInfos;

    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View itemView = mLayoutInflater.inflate(R.layout.item_count_time, parent, false);

        //下面两个不好看
//        View itemView = mLayoutInflater.inflate(R.layout.item_count_time, null);
//        View itemView = View.inflate(mContext,R.layout.item_count_time,null);

        return new CountTimeViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        CountTimeViewHolder countTimeViewHolder = (CountTimeViewHolder) holder;

        countTimeViewHolder.bindView(this.mCountTimeInfos, position);
    }

    @Override
    public int getItemCount() {
        return mCountTimeInfos.size();
    }


    private static class CountTimeViewHolder extends RecyclerView.ViewHolder {

        private final TextView mTv_content;
        private final TextView tv_count_down_time;
        private Timer mTimer;
        private Handler mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case 100:
                        String currentStringTime = TimeUtils.longToStringTime((Long) msg.obj);

                        tv_count_down_time.setText(currentStringTime);
                        break;
                }
            }
        };

        public CountTimeViewHolder(View itemView) {
            super(itemView);
            mTv_content = (TextView) itemView.findViewById(R.id.tv_content);
            tv_count_down_time = (TextView) itemView.findViewById(R.id.tv_count_down_time);
        }


        /**
         * 绑定View的内容
         *
         * @param countTimeInfos
         * @param position
         */
        public void bindView(List<CountTimeInfo> countTimeInfos, int position) {
            final CountTimeInfo countTimeInfo = countTimeInfos.get(position);
            mTv_content.setText(countTimeInfo.getContent());

            mTimer = new Timer();
            //刷新倒计时
            TimerTask timerTask = new TimerTask() {
                @Override
                public void run() {
                    Message msg = Message.obtain();
                    //结束时间减去当前时间
                    msg.what = 100;
                    msg.obj = countTimeInfo.getStopTime() - TimeUtils.getWebsiteDatetime();

                    mHandler.sendMessage(msg);
                }
            };

            //0秒之后每隔1秒执行一次run
            mTimer.schedule(timerTask, 1, 1000);

        }
    }
}

CountTimeInfo.java

package top.wintp.counttimedemo1;

/**
 * 描述:倒计时item的javabean
 * <p>
 * 作者:  你的感冒清
 * <p>
 * qq:  337081267
 * <p>
 * CSDN:    http://blog.csdn.net/pyfysf
 * <p>
 * 个人博客:    http://wintp.top
 * <p>
 * 时间:  17-5-18   上午9:12
 * <p>
 * 邮箱:  pyfysf@163.com
 */

public class CountTimeInfo {
    private String content;

    private long stopTime;
    private long createTime;
    private long needTime;

    public void setNeedTime(long needTime) {
        this.needTime = needTime;
    }

    public long getStopTime() {
        return getCreateTime() + this.needTime * 60 * 1000;

    }


    public long getCreateTime() {
        return createTime;
    }

    public void setCreateTime(long createTime) {
        this.createTime = createTime;
    }


    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public CountTimeInfo() {
    }

    @Override
    public String toString() {
        return "CountTimeInfo{" +
                "content='" + content + '\'' +
                '}';
    }
}

gradle(依赖)

    compile 'com.android.support:design:25.3.1'

    compile 'com.android.support:cardview-v7:25.3.1'










转载于:https://www.cnblogs.com/upuptop/p/11154433.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值