android– 带有多个倒计时器的Recyclerview会导致闪烁

android– 带有多个倒计时器的Recyclerview会导致闪烁,第1张

概述我想显示我的RecyclerView的每个单元格内剩余多少时间…因为我已经为每个单元格使用了倒数计时器.在每一行中我启动一个计数器并管理onTick()……所有工作都按预期工作……我有一个计时器勾选每一行,我的单元格也在更新,但我的单元格现在正在闪烁….而且它我滚动时发疯了.这是我的

我想显示我的RecyclerVIEw的每个单元格内剩余多少时间…因为我已经为每个单元格使用了倒数计时器.在每一行中我启动一个计数器并管理onTick()……所有工作都按预期工作……我有一个计时器勾选每一行,我的单元格也在更新,但我的单元格现在正在闪烁….而且它我滚动时发疯了.

这是我的适配器……

if (product.getProductType().equalsIgnoreCase("Auction Product")) {                isAuction=true;                vIEwHolder.img_product_type.setimageResource(R.drawable.bID);                vIEwHolder.txt_timeleft.setVisibility(VIEw.VISIBLE);               start_countDown(product.getStart(),product.getStop(),vIEwHolder.txt_timeleft);            }

计数器代码如下….

private voID start_countDown(String start, String stop, final TextVIEw txt_timeleft) {        try {            //Log.e("hetal",start+"....."+stop);            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");            Calendar start_date = Calendar.getInstance();            start_date.setTime(format.parse(start));            Calendar end_date = Calendar.getInstance();            end_date.setTime(format.parse(stop));            final Calendar today = Calendar.getInstance();            CountDownTimer timer;            txt_timeleft.setTextcolor(color.DKGRAY);            if(today.before(start_date)){                txt_timeleft.setTextcolor(context.getResources().getcolor(R.color.red));                txt_timeleft.setText(context.getString(R.string.auction_not_start));                Animation anim = new AlphaAnimation(0.0f, 1.0f);                anim.setDuration(1000); //You can manage the time of the blink with this parameter                anim.setStartOffset(20);                anim.setRepeatMode(Animation.REVERSE);                anim.setRepeatCount(Animation.INFINITE);                txt_timeleft.startAnimation(anim);                return;            }            if (!today.before(end_date)) {                txt_timeleft.setTextcolor(context.getResources().getcolor(R.color.red));                txt_timeleft.setText(context.getString(R.string.time_out));                        Animation anim = new AlphaAnimation(0.0f, 1.0f);                        anim.setDuration(1000); //You can manage the time of the blink with this parameter                        anim.setStartOffset(20);                        anim.setRepeatMode(Animation.REVERSE);                        anim.setRepeatCount(Animation.INFINITE);                txt_timeleft.startAnimation(anim);                return;            }            timer = new CountDownTimer(end_date.getTimeInMillis(), 1000) {                @OverrIDe                public voID onTick(long millisUntilFinished) {                    Calendar calendar = Calendar.getInstance();                    calendar.setTimeInMillis(millisUntilFinished);                    long diff = calendar.getTimeInMillis() - today.getTimeInMillis();                    long seconds = diff / 1000 % 60;                    long minutes = diff / (60 * 1000) % 60;                    long hours = diff / (60 * 60 * 1000) % 24;                    //long days = (int) diff / (24 * 60 * 60 * 1000);                    long days = TimeUnit.MILliSECONDS.toDays(diff);                    String left = "";                    if (days > 0)                        left += days + " " + context.getString(R.string.txt_day) + " ,";                    if (hours > 0)                        left += hours + " " + context.getString(R.string.txt_hour) + " ,";                    if (minutes > 0)                        left += minutes + " " + context.getString(R.string.txt_minute) + " ,";                    left += seconds + " " + context.getString(R.string.txt_second);                    final String finalleft = left;                            if (finalleft.equals("0") || finalleft.contains("-")) {                                txt_timeleft.setText(context.getString(R.string.time_out));                                txt_timeleft.setTextcolor(context.getResources().getcolor(R.color.red));                                Animation anim = new AlphaAnimation(0.0f, 1.0f);                                anim.setDuration(1000); //You can manage the time of the blink with this parameter                                anim.setStartOffset(20);                                anim.setRepeatMode(Animation.REVERSE);                                anim.setRepeatCount(Animation.INFINITE);                                txt_timeleft.startAnimation(anim);                            } else                                txt_timeleft.setText(finalleft);                }                @OverrIDe                public voID onFinish() {                }            };            timer.start();        }catch (Exception ex){            ex.printstacktrace();        }    }

解决方法:

thanx Hammad Tariq Sahi我用你的逻辑并以这种方式解决了我的问题….我也审查了这个link

在我的适配器

ArrayList<VIEwHolder> vIEwHoldersList;    private Handler handler = new Handler();    private Runnable updateRemainingTimeRunnable = new Runnable() {        @OverrIDe        public voID run() {            synchronized (vIEwHoldersList) {                for (VIEwHolder holder : vIEwHoldersList) {                    holder.updateTimeRemaining();                }            }        }    };

我的适配器的内部构造函数

vIEwHoldersList = new ArrayList<>();startUpdateTimer();

并添加此方法来计算时间

private voID startUpdateTimer() {        Timer tmr = new Timer();        tmr.schedule(new TimerTask() {            @OverrIDe            public voID run() {                handler.post(updateRemainingTimeRunnable);            }        }, 1000, 1000);    }

向我的vIEwholder类添加了两个方法

public voID setData(Product product){            this.product = product;        }        public voID updateTimeRemaining() {            if(product.getProductType().equalsIgnoreCase("Auction Product")) {                Log.e("hetal",product.getProductType());                try {                    String start = product.getStart();                    String stop = product.getStop();                    //txt_timeleft.setText("");                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");                    Calendar start_date = Calendar.getInstance();                    start_date.setTime(format.parse(start));                    Calendar end_date = Calendar.getInstance();                    end_date.setTime(format.parse(stop));                    final Calendar today = Calendar.getInstance();                    CountDownTimer timer;                    long timeDiff = end_date.getTimeInMillis() - today.getTimeInMillis();                    if (timeDiff > 0) {                        long seconds = timeDiff / 1000 % 60;                        long minutes = timeDiff / (60 * 1000) % 60;                        long hours = timeDiff / (60 * 60 * 1000) % 24;                        //long days = (int) diff / (24 * 60 * 60 * 1000);                        long days = TimeUnit.MILliSECONDS.toDays(timeDiff);                        String left = "";                        if (days > 0)                            left += days + " " + context.getString(R.string.txt_day) + " ,";                        if (hours > 0)                            left += hours + " " + context.getString(R.string.txt_hour) + " ,";                        if (minutes > 0)                            left += minutes + " " + context.getString(R.string.txt_minute) + " ,";                        left += seconds + " " + context.getString(R.string.txt_second);                        final String finalleft = left;                        txt_timeleft.setText(finalleft);                    } else {                        txt_timeleft.setText("Time Out !!");                    }                } catch (Exception ex) {                    ex.printstacktrace();                }            }        }

最后在onBindVIEwHolder中

synchronized (vIEwHoldersList) {                vIEwHolder.setData(product);                if(vIEwHoldersList.size()< (List.size()-2)) vIEwHoldersList.add(vIEwHolder);            }

完美……比所有人都好

总结

以上是内存溢出为你收集整理的android – 带有多个倒计时器的Recyclerview会导致闪烁全部内容,希望文章能够帮你解决android – 带有多个倒计时器的Recyclerview会导致闪烁所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1102855.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存