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

来源:互联网 发布:企业it解决方案 编辑:程序博客网 时间:2024/06/08 18:48


先上效果图:


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'










阅读全文
1 0
原创粉丝点击