【发布时间】:2015-06-01 00:30:54
【问题描述】:
所以我需要两个选项之一,但不知道从哪里开始。
我在回收站视图中有一个卡片视图列表。每个卡片视图都需要实现倒数计时器并且能够同时运行。 (似乎是更难的选择)或
根据指定的时间已过或系统时间是否达到指定的分钟和小时来更新卡片视图中的文本。
【问题讨论】:
标签: android android-layout text countdown android-cardview
所以我需要两个选项之一,但不知道从哪里开始。
我在回收站视图中有一个卡片视图列表。每个卡片视图都需要实现倒数计时器并且能够同时运行。 (似乎是更难的选择)或
根据指定的时间已过或系统时间是否达到指定的分钟和小时来更新卡片视图中的文本。
【问题讨论】:
标签: android android-layout text countdown android-cardview
要制作具有不同计时器的卡片,您需要线程。 Android 中最简单的方法是AsyncTask。所以你创建了一堆AsyncTasks(可能你想要一个ArrayList,你将在其中添加AsyncTasks),然后用一个循环简单地.execute()他们。
制作AsyncTask 非常容易。您只需创建一个派生自AsyncTask 的新类并实现doInBackground() 方法。
附:如果您正在为 Android 3.0 及更高版本进行开发,则需要以这种方式启动 AsyncTask:
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
这将使它们同时运行
【讨论】:
Date 对象,可能还需要一个线程来继续检查时间。另一种简单的方法是创建两个Date 对象——一个用于当前时间,一个用于您需要的时间——然后以毫秒为单位计算这两者之间的差异。然后您需要创建一个Thread 并将其冻结您已经计算的毫秒数
更新
正如其他人在其他帖子中所说,您必须知道何时启动和停止计时器,因为这会给您带来麻烦。 我设法在不取消回收站的情况下完成这项工作,所以这是我的代码。
public class ViewHolderContentCard extends RecyclerView.ViewHolder {
public TextView cardTv;
public CountdownUtils countdownUtils;
public ViewHolderContentCard(final View itemView) {
super(itemView);
cardTv = (TextView) itemView.findViewById(R.id.cardCountDownTvID);
countdownUtils = new CountdownUtils(cardTv);
}}
public class ContentRecyclerAdapterCard extends RecyclerView.Adapter<ViewHolderContentCard> {
private ArrayList<Content> mContentArrayList;
public ContentRecyclerAdapterCard(ArrayList<Content> contentArrayList) {
this.mContentArrayList = contentArrayList;
}
@Override
public ViewHolderContentCard onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_content, parent, false);
ViewHolderContentCard viewHolderContentCard = new ViewHolderContentCard(view);
return viewHolderContentCard;
}
@Override
public void onBindViewHolder(ViewHolderContentCard holder, int position) {
holder.cardTextTv.setText(mContentArrayList.get(position).getmTitle());
//update count down
holder.countdownUtils.updateCountdownTv(mContentArrayList.get(position));
}
@Override
public int getItemCount() {
return mContentArrayList.size();
}}
public class CountdownUtils {
private TextView mTextView;
private CountDownTimer mTimer;
public CountdownUtils(TextView textView) {
mTextView = textView;
}
public void updateCountdownTv(Content content) {
//cancel old timer to make sure one timer is updating one card
cleanUpTimer();
//get beginning and expiration period
String dateFrom = content.getmDateFrom();
String dateTo = content.getmDateTo();
String timeFrom = content.getmTimeFrom();
String timeTo = content.getmTimeTo();
//process dates and update the countdown
processCountDownAndUpdateUI(mTextView, dateFrom, dateTo, timeFrom, timeTo);
}
private void processCountDownAndUpdateUI(final TextView textView, String dateFrom, String dateTo, String timeFrom, String timeTo) {
try {
//format date and time
Date beginningPeriod = getDateFromString(dateFrom, timeFrom);
Date expirationPeriod = getDateFromString(dateTo, timeTo);
//check beginning period with current time
if (System.currentTimeMillis() < beginningPeriod.getTime()) {
//we know that the is not available yet so display staring period - update the UI
textView.setText("Starting from: " + dateFrom + " " + timeFrom);
} else if (expirationPeriod.getTime() > System.currentTimeMillis()) {
long availabilityPeriod = getAvailabilityPeriod(expirationPeriod);
if (availabilityPeriod != 0) {
//we have a valid avilability period so we need to start the countdown - update the UI
startCountDownTimer(textView, availabilityPeriod);
}
}
} catch (ParseException e) {
e.printStackTrace();
}
}
private void startCountDownTimer(final TextView textView, long availabilityPeriod) {
//create countdown timer, count each second
mTimer = new CountDownTimer(availabilityPeriod, 1000) {
@Override
public void onTick(long millisUntilFinished) {
//format string will be displayed
String timeSting = String.format("%d days %02d:%02d:%02d",
TimeUnit.MILLISECONDS.toDays(millisUntilFinished),
TimeUnit.MILLISECONDS.toHours(millisUntilFinished) - TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(millisUntilFinished)),
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millisUntilFinished)),
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)));
//display countdown
textView.setText(timeSting);
}
@Override
public void onFinish() {
//expired inform the user
textView.setText("Expired");
}
}.start();
}
private long getAvailabilityPeriod(Date periodFrom) {
long availabilityPeriod = 0;
//get expiration date as long
long expPeriod = periodFrom.getTime();
//check availability period
if (expPeriod > System.currentTimeMillis()) {
availabilityPeriod = expPeriod - System.currentTimeMillis();
}
return availabilityPeriod;
}
private Date getDateFromString(String date, String time) throws ParseException {
//extract data as date and time
Date formattedDate = new SimpleDateFormat("yyyy/MM/dd HH:mm").parse(date + " " + time);
return formattedDate;
}
public void cleanUpTimer() {
if (mTimer != null){
mTimer.cancel();
} }}
【讨论】: