android实现倒计时,最简单实现RecyclerView倒计时+SwipeRefreshLayout下拉刷新
2017-05-18 11:33
405 查看
先上效果图:
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加载不同布局简单实现
- android UI开发之RecyclerView(一)简单实现
- android中RecyclerView的简单使用(四)——上下拉刷新的实现
- android中RecyclerView的简单使用(四)——上下拉刷新的实现
- Android -- RecyclerView(超简单)实现可展开列表
- android 简单实现 RecyclerView 下拉刷新上拉加载
- android中RecyclerView的简单使用(四)——上下拉刷新的实现
- [置顶] Android-RecyclerView实现购物车简单功能
- Android ViewPager简单实现 - 倒计时、引导页左右滑动
- Android---RecyclerView之简单瀑布流实现
- Android:RecyclerView视图,item之间分割线的极简单实现
- Android RecyclerView加载不同布局简单实现
- Android RecyclerView与泛型 简单实现多布局
- Android-RecyclerView--实现一级购物车简单功能
- Android 整合实现简单易用、功能强大的RecyclerView
- Android 时间轴的实现(RecyclerView更简单)
- 【Android实战】----RecyclerView下拉刷新和上拉加载的简单实现
- Android Recyclerview粘性头部 简单实现
- Android XRecyclerView简单实现上拉刷新,下拉加载
- Android 解析RecyclerView(3)——以更简单的方法实现带顶部View和底部View的RecyclerView