如何在recyclerview元素中设置固定的CountDownTimer?

问题描述 投票:1回答:2

我有以下recyclerview:

enter image description here

当我按下开始按钮时,CountDownTimer开始倒数,但是问题是,如果我在问题示例1(或任何其他问题元素)上开始倒数,则倒数开始,但是如果我向下滚动到在recyclerview的底部,计时器重置。

第二个问题是,当我从这个片段切换到另一个片段时(例如:使用backpress返回上一个片段),计时器重置。

我不知道,如何解决此问题,请帮助我。

我的recyclerview适配器如下:


import android.content.Context;
import android.os.CountDownTimer;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.text.MessageFormat;
import java.util.ArrayList;

public class QuestionsAdapter extends RecyclerView.Adapter<QuestionsAdapter.QuestionsViewHolder>
{
    Context context;
    ArrayList<Question> questions;

    public static class QuestionsViewHolder extends RecyclerView.ViewHolder
    {
        public TextView questionname;
        public TextView status;
        public TextView timereamining;
        public Button start;

        public QuestionsViewHolder(View v)
        {
            super(v);

            questionname=v.findViewById(R.id.questiontext);
            status=v.findViewById(R.id.statusstr);
            timereamining=v.findViewById(R.id.time);
            start=v.findViewById(R.id.startbutton);
        }
    }

    public QuestionsAdapter(Context context,ArrayList<Question> dataset)
    {
        this.context=context;
        this.questions=dataset;
    }

    @NonNull
    @Override
    public  QuestionsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
    {
        View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.listofquestions,parent,false);

        return new QuestionsViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull final QuestionsViewHolder holder, final int position)
    {
        holder.questionname.setText(questions.get(position).getQuestionname());
        holder.status.setText(questions.get(position).getStatus());
        holder.timereamining.setText(String.valueOf(questions.get(position).getTimelimit())+":00");

        holder.start.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                new CountDownTimer(questions.get(position).getTimelimit()*60000, 1000)
                {
                    public void onTick(long millisUntilFinished)
                    {
                        long minutes=millisUntilFinished/60000;
                        long seconds=millisUntilFinished%60000/1000;

                        String timeleft;

                        timeleft=""+minutes;
                        timeleft+=":";
                        if(seconds<10)
                        {
                            timeleft+="0";
                        }

                        timeleft+=seconds;
                        holder.timereamining.setText(timeleft);

                    }

                    public void onFinish()
                    {
                        holder.timereamining.setText("done!");
                    }

                }.start();
            }
        });
    }

    @Override
    public int getItemCount()
    {
        return questions.size();
    }
}
java android android-fragments android-recyclerview countdowntimer
2个回答
0
投票

您遇到的问题是由于RecyclerView的固有性质。这是一个很好的资源,可以解释正在发生的事情:Understanding RecyclerView

[RecyclerView回收您的物料行时,您将丢失该行所持有的任何状态。可能会帮助您完成后续工作的一些想法是,在项目行外部唯一地启动每个计数器,并在适配器内部保持关系,因此,当您滚动回到该项目位置时,该行可以重新连接至其计数器。您也可以使用列表视图,因为它不会(总是)回收行,但是考虑到这一点后,我不建议这样做。 List View Recycling


0
投票

[当项目滚动出屏幕时,recyclerview会recycle该项目。

这意味着,同一位置的onBindViewHolder会进入数次,而针对不同数据呈现的特定viewHolder取决于滚动状态。

考虑onTick方法应更改数据,并调用适配器的notifyItemChagne方法,而不是直接更改viewHolder。

more detail

© www.soinside.com 2019 - 2024. All rights reserved.