先上效果图:

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. JavaScript isNaN() 函数
  2. Linux初记
  3. [BZOJ1579][Usaco2009 Feb]Revamping Trails 道路升级(二维最短路问题)
  4. ExtJS学习之路第二步:Ext.Component 和 Ext.dom.Element 的区别
  5. 搜索框UISearchController的使用(iOS8.0以后替代UISearchBar + UISearchDisplayController)
  6. scala的静态,单列模式
  7. 创建一个EMS 扩展包
  8. Java类加载的时机_4种主动引用会触犯类加载+剩下的被动引用不会触发类的加载
  9. webSocket vnc rfb
  10. ZOJ 4114 Detect the Virus(AC自动机)
  11. IOS学习之IOS沙盒(sandbox)机制和文件操作
  12. MSSQLSERVER数据库- 解决不允许保存更改表结构
  13. VC下Debug和Release区别
  14. 微信小程序实例源码大全
  15. Spring REST API + OAuth2 + AngularJS
  16. ⏰Day.js 2kB超轻量时间库 和Moment.js一样的API
  17. 了解 ptyhon垃圾回收机制
  18. azkaban执行错误 Job failed, Cannot request memory (Xms 0 kb, Xmx 0 kb) from system for job
  19. 前端 js加密 后台java 解密 RSA
  20. hdu 3016 Man Down

热门文章

  1. Android卡片设置透明度失效问题
  2. 高斯判别分析模型( Gaussian discriminant analysis)及Python实现
  3. How Qt Signals and Slots Work(感觉是通过Meta根据名字来调用)
  4. Codility--- TapeEquilibrium
  5. GO方法与接口
  6. Java基础(四) StringBuffer、StringBuilder原理浅析
  7. 接口和抽象类是否继承了Object
  8. 全网唯一的纯前端实现的canvas支持多图压缩并打包下载的工具
  9. Kibana 7.1.1 安装及简单使用
  10. 并发编程-concurrent指南-Lock