我想显示我的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);
}
完美的作品.... thanx all
关于android - 具有多个倒数计时器的Recyclerview导致闪烁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35860780/