先上效果图:

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'

android实现倒计时,最简单实现RecyclerView倒计时+SwipeRefreshLayout下拉刷新的更多相关文章

  1. Android零基础入门第72节:SwipeRefreshLayout下拉刷新

    在实际开发中,经常都会遇到下拉刷新.上拉加载更多的情形,这一期就一起来学习Android系统的SwipeRefreshLayout下拉刷新组件. 一.SwipeRefreshLayout简介 Swip ...

  2. Android之SwipeRefreshLayout下拉刷新组件

    SwipeRefreshLayout概述 SwipeRefrshLayout是Google官方更新的一个Widget,可以实现下拉刷新的效果.该控件集成自ViewGroup在support-v4兼容包 ...

  3. Android之RecyclerView轻松实现下拉刷新和加载更多

    今天研究了下RecyclerView的滑动事件,特别是下拉刷新和加载更多事件,在现在几乎所有的APP显示数据列表时都用到了.自定义RecyclerView下拉刷新和加载更多听上去很复杂,实际上并不难, ...

  4. Android 学习笔记之AndBase框架学习(六) PullToRefrech 下拉刷新的实现

    PS:Struggle for a better future 学习内容: 1.PullToRefrech下拉刷新的实现...   不得不说AndBase这个开源框架确实是非常的强大..把大部分的东西 ...

  5. Android Material Design控件使用(四)——下拉刷新 SwipeRefreshLayout

    使用下拉刷新SwipeRefreshLayout 说明 SwipeRefreshLayout是Android官方的一个下拉刷新控件,一般我们使用此布局和一个RecyclerView嵌套使用 使用 xm ...

  6. [Android实例] Android 6.0RecyclerView SwipeRefreshLayout 下拉刷新 上拉加载

    这是Android 6.0的 SwipeRefreshLayout 实现下拉刷新和RecyclerView的上拉加载更多,以及添加分割线等 Android <ignore_js_op> r ...

  7. Android SwipeRefreshLayout 下拉刷新——Hi_博客 Android App 开发笔记

    以前写下拉刷新 感觉好费劲,要判断ListView是否滚到顶部,还要加载头布局,还要控制 头布局的状态,等等一大堆.感觉麻烦死了.今天学习了SwipeRefreshLayout 的用法,来分享一下,有 ...

  8. .Net 转战 Android 4.4 日常笔记(10)--PullToRefresh下拉刷新使用

    下拉刷新很多地方都用到了,新浪微博,微信,百度新闻 这里我们使用一个开源的库叫:PullToRefresh 开源地址:https://github.com/chenyoca/pull-to-refre ...

  9. SwipeRefreshLayout下拉刷新简单用例

    自己的下拉刷新组件 下拉刷新并自动添加数据 MainActivity package com.shaoxin.myswiperefreshlayout; import android.graphics ...

随机推荐

  1. linux+php+swoole解决方案

    服务器接收巨量的并发我使用linux+php+swoole解决方案.简单快速高效 并发量大 稳定 http://www.swoole.com/

  2. Spring Boot之Actuator的端点

    Spring Boot Actuator的关键特性是在应用程序里提供众多Web端点,通过它们了解应用程序 运行时的内部状况.有了Actuator,你可以知道Bean在Spring应用程序上下文里是如何 ...

  3. spring源码解析之IOC容器(三)——依赖注入

    上一篇主要是跟踪了IOC容器对bean标签进行解析之后存入Map中的过程,这些bean只是以BeanDefinition为载体单纯的存储起来了,并没有转换成一个个的对象,今天继续进行跟踪,看一看IOC ...

  4. 浅谈Java中的命名规范

    现代软件架构的复杂性需要协同开发完成,如何高效地协同呢? 答案是:制定一整套统一的规范. 无规矩不成方圆,无规范难以协同,比如,制订交通法规表面上是要限制行车权,实际上是保障公众的人身安全,试想如果没 ...

  5. git实战经验(很实用)

    推荐学习git很好的网站https://www.breakyizhan.com/git/216.html 以下内容,虽然编排不行,但是请认真的读下去,都是自己平时请自操作的,放心使用. 这是个人的gi ...

  6. 使用Core Audio实现VoIP通用音频模块

    最近一直在做iOS音频技术相关的项目,由于单项直播SDK,互动直播SDK(iOS/Mac),短视频SDK,都会用到音频技术,因此在这里收集三个SDK的音频技术需求,开发一个通用的音频模块用于三个SDK ...

  7. spark 源码分析之二 -- SparkContext 的初始化过程

    创建或使用现有Session 从Spark 2.0 开始,引入了 SparkSession的概念,创建或使用已有的session 代码如下: val spark = SparkSession .bui ...

  8. 100天搞定机器学习|Day1数据预处理

    数据预处理是机器学习中最基础也最麻烦的一部分内容 在我们把精力扑倒各种算法的推导之前,最应该做的就是把数据预处理先搞定 在之后的每个算法实现和案例练手过程中,这一步都必不可少 同学们也不要嫌麻烦,动起 ...

  9. docker 获取镜像

    之前提到过,Docker Hub 上有大量的高质量的镜像可以用,这里我们就说一下怎么获取这些镜像. 从 Docker 镜像仓库获取镜像的命令是 docker pull.其命令格式为: docker p ...

  10. 装饰器&递归

    装饰器 1.开放封闭原则 ​ 在源码不改变的情况下,增加一些额外的功能 对扩展是开放的,对修改是封闭的 1.1 开放原则:增加额外新功能 1.2 封闭原则:不要改变源码 2 装饰器 满足开放封闭原则, ...