我想显示我的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会导致闪烁所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)