簡體   English   中英

回收者視圖中的多個倒計時器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM