Java 如何在recyclerview元素中设置固定的倒计时?
我有以下回收视图:Java 如何在recyclerview元素中设置固定的倒计时?,java,android,android-fragments,android-recyclerview,countdowntimer,Java,Android,Android Fragments,Android Recyclerview,Countdowntimer,我有以下回收视图: 当我按下开始按钮时,倒计时计时器开始倒计时,但问题是,如果我在问题示例1(或任何其他问题元素)上开始倒计时,倒计时开始,但如果我向下滚动到回收视图的底部,计时器将重置 第二个问题是,当我从这个片段切换到另一个片段时(例如:使用backpress返回到上一个片段),计时器重置 我不知道,如何解决这个问题,请帮助我 我的recyclerview适配器如下所示: import android.content.Context; import android.os.CountDo
当我按下开始按钮时,倒计时计时器开始倒计时,但问题是,如果我在问题示例1(或任何其他问题元素)上开始倒计时,倒计时开始,但如果我向下滚动到回收视图的底部,计时器将重置 第二个问题是,当我从这个片段切换到另一个片段时(例如:使用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();
}
}
导入android.content.Context;
导入android.os.CountDownTimer;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.Button;
导入android.widget.TextView;
导入androidx.annotation.NonNull;
导入androidx.recyclerview.widget.recyclerview;
导入java.text.MessageFormat;
导入java.util.ArrayList;
公共类问题适配器扩展了RecyclerView.Adapter
{
语境;
ArrayList问题;
公共静态类问题ViewHolder扩展了RecyclerView.ViewHolder
{
公共文本视图问题名称;
公共文本视图状态;
公共文本视图时间刷新;
公共按钮启动;
公众问题咨询人(视图五)
{
超级(五);
questionname=v.findViewById(R.id.questiontext);
status=v.findViewById(R.id.statusstr);
timereamining=v.findviewbyd(R.id.time);
开始=v.findViewById(R.id.startbutton);
}
}
公共问题数据库(上下文,ArrayList数据集)
{
this.context=context;
this.questions=dataset;
}
@非空
@凌驾
公共问题viewholder onCreateViewHolder(@NonNull ViewGroup父级,int viewType)
{
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.listofquestions,parent,false);
返回新问题查看者(v);
}
@凌驾
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(新视图.OnClickListener()
{
@凌驾
公共void onClick(视图v)
{
新的倒计时(questions.get(position.getTimelimit()*600001000)
{
公共void onTick(长毫秒未完成)
{
长分钟=毫秒/60000;
长秒=毫秒直到完成%60000/1000;
字符串超时;
timeleft=“”+分钟;
timeleft+=“:”;
如果(秒您遇到的问题是由于RecyclerView
的固有特性造成的。这是一个很好的资源,可以解释发生的情况:
当RecyclerView
回收您的项目行时,您将丢失该行中的任何状态。一些可能有助于您完成所需任务的方法是在项目行外部唯一地启动每个计数器,并在适配器内部保持关系,因此当您滚动回该项目位置时行可以重新连接到其计数器。您也可以使用列表视图,因为它不会(始终)回收您的行,但考虑到这一点,我不推荐使用它。您遇到的问题是由于RecyclerView
的固有特性。这是一个很好的资源,可以解释发生的情况:
当RecyclerView
回收您的项目行时,您将丢失该行中的任何状态。一些可能有助于您完成所需任务的方法是在项目行外部唯一地启动每个计数器,并在适配器内部保持关系,因此当您滚动回该项目位置时行可以重新连接到其计数器。您也可以使用列表视图,因为它不会(始终)回收您的行,但考虑到这一点后,我不推荐使用它。当一个项目从屏幕上滚出时,recyclerview将回收该项目
这意味着,同一位置的onBindViewHolder将被分为几次,并且一个特定的viewHolder将根据不同的数据滚动状态显示
考虑onTick
方法应该更改数据,并调用适配器的notifyItemChagne
方法,而不是直接更改viewHolder
当一个项目从屏幕中滚出时,recyclerview将回收该项目
这意味着,同一位置的onBindViewHolder将被分为几次,并且一个特定的viewHolder将根据不同的数据滚动状态显示
考虑onTick
方法应该更改数据,并调用适配器的notifyItemChagne
方法,而不是直接更改viewHolder
所以,每个问题的计时器只能启动一次,不是吗?即使用户离开你的片段然后回来?所以,每个问题的计时器只能启动一次,不是吗?即使用户离开你的片段然后回来?谢谢,我会尝试使用列表视图。我只会在最后一次使用时才这样做如果您的数据太大,列表视图仍会倾向于循环使用。我会首先尝试实现另一种模式,而不是将计时器放在每一行中。谢谢,我会尝试使用列表视图。我会这样做,只是作为您的最后手段,当您的数据太大时,列表视图仍会倾向于循环使用。我首先