【问题标题】:onScroll RecyclerView Timer value changes in AdapterAdapter中的onScroll RecyclerView Timer值变化
【发布时间】:2019-05-05 12:08:34
【问题描述】:

我在 recyclerView 中为每一行都有一个倒数计时器,当数据第一次膨胀时,它会显示正确的数据。但是,一旦我向下滚动并返回上一阶段,倒数计时器就会显示不正确的数据。我关注了很多此类问题,但我无法弄清楚。

JSON 响应

    {
"contest_id":10,
"contest_name":"PAK vs AUS",
"contest_time":"30.12.2018, 22:30:00",
"current_time":"04.12.2018, 11:16:50",
"micro_time":1543902410.850009918212890625,
"milliseconds":1543902410850
}

代码 onBindViewHolder 代码:

String parseServerDate= contestList.getContestTime();
        String cureentServerDate = contestList.getCurrentTime();
              if (holder.timer != null) {
            holder.timer.cancel();
        }
        cureentServerDate= cureentServerDate.replaceAll(","," ");
        parseServerDate= parseServerDate.replaceAll(","," ");
        holder.countDownStart(cureentServerDate,parseServerDate,holder,position);



private void countDownStart(String s1, String s2, final MyViewHolder holder, int position) {
        d1 = null;
        d2 = null;
        SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
        try {
            d1 = formatter.parse(s1);
            d2 = formatter.parse(s2);
            diff = d2.getTime() - d1.getTime();
            diffSeconds = diff / 1000 % 60;
            diffMinutes = diff / (60 * 1000) % 60;
            diffHours = diff / (60 * 60 * 1000) % 24;
            diffDays = diff / (24 * 60 * 60 * 1000);

            mydiff = TimeUnit.DAYS.toMillis(diffDays)+TimeUnit.HOURS.toMillis(diffHours)+TimeUnit.MINUTES.toMillis(diffMinutes)+TimeUnit.SECONDS.toMillis(diffSeconds);
            calculateTimer(mydiff);

        }
        catch (Exception e)
        {
            System.out.print(e);
        }
    }




public void calculateTimer(long mydiff){

       timer =  new CountDownTimer(mydiff,1000) {
            @RequiresApi(api = Build.VERSION_CODES.N)
            public void onTick(long millisUntilFinished) {
                /*converting the milliseconds into days, hours, minutes and seconds and displaying it in textviews */
                mDays.setText(checkDigit(Integer.parseInt(String.valueOf(TimeUnit.HOURS.toDays(TimeUnit.MILLISECONDS.toHours(millisUntilFinished))))) + "Days");
                mHH.setText(checkDigit(Integer.parseInt(String.valueOf((TimeUnit.MILLISECONDS.toHours(millisUntilFinished) - TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(millisUntilFinished)))))) + "" + ":");
                mMM.setText(checkDigit(Integer.parseInt(String.valueOf((TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millisUntilFinished)))))) + ":");
                mSS.setText(checkDigit(Integer.parseInt(String.valueOf((TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)))))) + "");


            }
            @Override
            public void onFinish() {
            }
        }.start();
    }

【问题讨论】:

    标签: android android-recyclerview countdowntimer


    【解决方案1】:

    你可以试试这个它对我有用,在 onBindViewHolder 但是这一行

    viewHolder.setIsRecyclable(false);
    

    【讨论】:

    • 这有时会是不好的做法。我建议在设置适配器时在活动内部使用yourRecyclerView.setItemViewCacheSize(yourList.size()) 而不是这个。
    • 谁能解释一下,上面一行的目的是什么
    • @DhruvTyagi 当您在 recyclerview 中向下滚动时,以前的项目会从适配器中分离出来,如果您再次向上滚动,适配器会创建一个新的 recyclerview 项目。因此,如果您的 recyclerview 中有活动项目(如本例),对于长列表,您应该根据您的情况致电 viewHolder.setIsRecyclable(false);yourRecyclerView.setItemViewCacheSize(yourList.size())
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    相关资源
    最近更新 更多