android实现倒计时,最简单实现RecyclerView倒计时+SwipeRefreshLayout下拉刷新
2024-10-02 05:33:19
先上效果图:
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'
最新文章
- JavaScript isNaN() 函数
- Linux初记
- [BZOJ1579][Usaco2009 Feb]Revamping Trails 道路升级(二维最短路问题)
- ExtJS学习之路第二步:Ext.Component 和 Ext.dom.Element 的区别
- 搜索框UISearchController的使用(iOS8.0以后替代UISearchBar + UISearchDisplayController)
- scala的静态,单列模式
- 创建一个EMS 扩展包
- Java类加载的时机_4种主动引用会触犯类加载+剩下的被动引用不会触发类的加载
- webSocket vnc rfb
- ZOJ 4114 Detect the Virus(AC自动机)
- IOS学习之IOS沙盒(sandbox)机制和文件操作
- MSSQLSERVER数据库- 解决不允许保存更改表结构
- VC下Debug和Release区别
- 微信小程序实例源码大全
- Spring REST API + OAuth2 + AngularJS
- ⏰Day.js 2kB超轻量时间库 和Moment.js一样的API
- 了解 ptyhon垃圾回收机制
- azkaban执行错误 Job failed, Cannot request memory (Xms 0 kb, Xmx 0 kb) from system for job
- 前端 js加密 后台java 解密 RSA
- hdu 3016 Man Down
热门文章
- Android卡片设置透明度失效问题
- 高斯判别分析模型( Gaussian discriminant analysis)及Python实现
- How Qt Signals and Slots Work(感觉是通过Meta根据名字来调用)
- Codility--- TapeEquilibrium
- GO方法与接口
- Java基础(四) StringBuffer、StringBuilder原理浅析
- 接口和抽象类是否继承了Object
- 全网唯一的纯前端实现的canvas支持多图压缩并打包下载的工具
- Kibana 7.1.1 安装及简单使用
- 并发编程-concurrent指南-Lock