java - 如何在 recyclerview 元素中设置固定的 CountDownTimer?
问题描述
我有以下回收者视图:
当我按下“开始”按钮时,CountDownTimer 开始倒计时,但问题是,如果我在问题示例 1(或任何其他问题元素)上开始倒计时,倒计时开始,但如果我向下滚动到回收站的底部查看计时器重置。
第二个问题是,当我从这个片段切换到另一个片段时(例如:使用回压回到上一个片段),计时器会重置。
我不知道如何解决这个问题,请帮助我。
我的 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();
}
}
解决方案
当一个项目滚动出屏幕时,recyclerview 将recycle
这个项目。
这意味着,相同位置的 onBindViewHolder 将进入多次,并且针对不同数据的特定 viewHolder 将取决于滚动状态。
考虑onTick
方法应该改变数据,调用适配器的notifyItemChagne
方法而不是直接改变viewHolder。
推荐阅读
- python - 我从 agaricus.txt.train 加载什么?
- c - 有没有办法用 for 循环按降序浏览和排序 C 中的结构元素?
- php - 为什么 INSERT INTO 不能在几乎相同的代码中工作?
- arrays - 将阵列中的纹理采样到 Voronoi 单元中
- kotlin - 如何避免公共财产?
- python - 仅获取在 Python 中使用 imaplib 获得的电子邮件的文本/纯文本部分
- python - 我想计算循环,其中列表相等和不相等
- wordpress - 如何在wordpress中创建与任何页面无关的菜单标题?
- java - 无法访问主线程上的数据库,因为它可能会长时间锁定 UI
- javascript - Kotlin eval() 危险吗?