【问题标题】:How to change text based on time and date?如何根据时间和日期更改文本?
【发布时间】:2015-06-01 00:30:54
【问题描述】:

所以我需要两个选项之一,但不知道从哪里开始。

  • 我在回收站视图中有一个卡片视图列表。每个卡片视图都需要实现倒数计时器并且能够同时运行。 (似乎是更难的选择)或

  • 根据指定的时间已过或系统时间是否达到指定的分钟和小时来更新卡片视图中的文本。

【问题讨论】:

    标签: android android-layout text countdown android-cardview


    【解决方案1】:

    要制作具有不同计时器的卡片,您需要线程。 Android 中最简单的方法是AsyncTask。所以你创建了一堆AsyncTasks(可能你想要一个ArrayList,你将在其中添加AsyncTasks),然后用一个循环简单地.execute()他们。

    制作AsyncTask 非常容易。您只需创建一个派生自AsyncTask 的新类并实现doInBackground() 方法。

    附:如果您正在为 Android 3.0 及更高版本进行开发,则需要以这种方式启动 AsyncTask:

    .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    

    这将使它们同时运行

    【讨论】:

    • 这会消耗大量电池吗?并在用户单击主页按钮时继续运行?
    • @AdrianLeRoyDevezin 它不会消耗大量电池,因为每个应用程序中都有很多线程在运行。默认情况下,如果用户单击主页按钮,它将运行。但这取决于你想做什么。如果您想在计时器完成工作时发出某种警报,那没关系(尽管您可能会考虑使用服务)。如果您想返回应用程序屏幕并继续工作,它可能会变得很棘手。 Android 活动进入暂停状态,如果您的系统内存不足,您的应用程序可能会关闭。所以我不会真的指望那个
    • 似乎最好根据特定时间更改文本。无论如何要这样做?
    • @AdrianLeRoyDevezin 实际上并不比我告诉你的选项容易得多(尽管我建议你试试我对你说的,因为它是一个广泛使用的类)但我想比你将需要一个Date 对象,可能还需要一个线程来继续检查时间。另一种简单的方法是创建两个Date 对象——一个用于当前时间,一个用于您需要的时间——然后以毫秒为单位计算这两者之间的差异。然后您需要创建一个Thread 并将其冻结您已经计算的毫秒数
    【解决方案2】:

    更新

    正如其他人在其他帖子中所说,您必须知道何时启动和停止计时器,因为这会给您带来麻烦。 我设法在不取消回收站的情况下完成这项工作,所以这是我的代码。

    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();
        }    }}
    

    【讨论】:

      猜你喜欢
      • 2015-03-18
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 2018-01-24
      • 2022-12-15
      相关资源
      最近更新 更多