I want to show how much time is left inside each cell of my RecyclerView
...for that I have used a countdown timer for each. In each row I start a counter and manage onTick()
...all works as expected...I've got a timer tick for each row and my cell is also updating but my cell is flickering now....and it goes crazy when I scroll.
Here is my adapter...
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);
}
counter code is as below....
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();
}
}