[英]Multiple countdowntimers in recycler view
我的countdownTimers
工作正常,但我的問題是它們都與最后的countdownTimer
同步( recyclerview
bank或item)例如我在第一項中的時間間隔為30秒,在第二項中是30秒,在第3項中是60秒當我運行我的應用項目時1和項目2將與項目3,60秒同步,我想我在整個recyclerview
有一個countdownTimer
,而不是每個項目。
這是我的銀行清單查看持有人:
private static class BankListViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private ImageView mImageViewBankLogo;
private TextView mBankName;
private TextView mFirstToken;
private TextView mSecondToken;
private Button mButtonAddToken;
private RelativeLayout mRelativeLayoutFirstTokenRowLayout;
private RelativeLayout mRelativeLayoutSecondTokenRowLayout;
private Callback mCallback;
private ProgressBarView mProgressBarView;
private CountDownTimer countDownTimer;
BankListViewHolder(@NonNull View itemView, Callback callback) {
super(itemView);
mCallback = callback;
mImageViewBankLogo = itemView.findViewById(R.id.imageview_banklist_logo);
mProgressBarView = itemView.findViewById(R.id.imageview_overlay);
mBankName = itemView.findViewById(R.id.textview_banklist_bankname);
mFirstToken = itemView.findViewById(R.id.textview_banklist_firsttoken);
mSecondToken = itemView.findViewById(R.id.textview_banklist_secondtoken);
mButtonAddToken = itemView.findViewById(R.id.button_banklist_addtoken);
mRelativeLayoutSecondTokenRowLayout = itemView.findViewById(R.id.relativelayout_banklist_secondtokenrowlayout);
mRelativeLayoutFirstTokenRowLayout = itemView.findViewById(R.id.relativelayout_banklist_firsttokenrowlayout);
mButtonAddToken.setOnClickListener(this);
mRelativeLayoutSecondTokenRowLayout.setOnClickListener(this);
mRelativeLayoutFirstTokenRowLayout.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.relativelayout_banklist_firsttokenrowlayout) {
BankUtil.copyToClipBoard(mFirstToken.getText().toString(), v.getContext());
SnackbarUtil.showSnackbarNotify(v, v.getContext().getString(R.string.banklist_copyotp), v.getContext());
}
if (v.getId() == R.id.relativelayout_banklist_secondtokenrowlayout) {
BankUtil.copyToClipBoard(mSecondToken.getText().toString(), v.getContext());
SnackbarUtil.showSnackbarNotify(v, v.getContext().getString(R.string.banklist_copyotp), v.getContext());
}
if (v.getId() == R.id.button_banklist_addtoken) {
mCallback.navigationToQrScanner(getAdapterPosition());
}
}
}
這是我的onBindViewHolder
:
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
.
.
.
bankListViewHolder.mFirstToken.setText(setSpaceBetweenCharacters(generateOtp(bank, 1)));
bankListViewHolder.mSecondToken.setText(setSpaceBetweenCharacters(generateOtp(bank, 2)));
bankListViewHolder.mButtonAddToken.setVisibility(View.GONE);
bankListViewHolder.mImageViewBankLogo.setImageDrawable(BankUtil.getLogo(mRoot.getContext(), mBankList.get(position)));
int currentSecond = (int) (((System.currentTimeMillis() / 1000) -
(bank.getToken().getOtpGenerationPeriodInSeconds() / 1000)) % (bank.getToken().getOtpGenerationPeriodInSeconds() / 1000));
int diff = ((bank.getToken().getOtpGenerationPeriodInSeconds() / 1000) - currentSecond);
bankListViewHolder.countDownTimer = new CountDownTimer(diff * 1000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
bankListViewHolder.mProgressBarView.setCounter((int) ((bank.getToken().getOtpGenerationPeriodInSeconds() / 1000) -
(millisUntilFinished / 1000)) * (360 / (bank.getToken().getOtpGenerationPeriodInSeconds() / 1000)));
}
@Override
public void onFinish() {
bankListViewHolder.mFirstToken.setText(generateOtp(bank, 1));
bankListViewHolder.mSecondToken.setText(generateOtp(bank, 2));
mCallback.updateList();
start();
}
};
countDownTimerList.add(bankListViewHolder.countDownTimer);
bankListViewHolder.countDownTimer.start();
mCallback.saveCountDownTimer(bankListViewHolder.countDownTimer);
.
.
.
}
您不應將countDownTimer
放在viewHolder
。 請記住, viewHolder
是一個臨時視圖,可以被其他項重用。 這是recyclerView
的特征(視圖可以回收)。
您應該將countDownTimer
放入List類中。 每個項目一個。 或者創建countDownTimers
的新ArrayList。
在onTick
事件中,您可以使用notifyItemChanged
更新其值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.