我遇到多个倒计时器和循环视图的问题。当我添加新计时器时,前一个计时器停止。然后它非常奇怪,当秒数相同时,许多计时器可以一次工作。我搜索了很多,但没有找到我的问题的解决方案。请帮帮我
我的持有人班级
public class MyViewHolder extends RecyclerView.ViewHolder{
private long timeCountInMilliSeconds = 1 * 60000;
private enum TimerStatus {
STARTED,
STOPPED
}
public TextView title;
private TimerStatus timerStatus = TimerStatus.STOPPED;
private ProgressBar progressBarCV;
public TextView textViewTimeCV;
private CountDownTimer countDownTimer;
private Handler handler;
public MyViewHolder(View view) {
super(view);
initViews(view);
}
private void initViews(View view) {
title = (TextView) view.findViewById(R.id.title);
progressBarCV = (ProgressBar) view.findViewById(R.id.progressBarCV);
textViewTimeCV = (TextView) view.findViewById(R.id.textViewTimeCV);
}
public void startStop(String minutes) {
if (timerStatus == TimerStatus.STOPPED) {
// call to initialize the timer values
setTimerValues(minutes);
// call to initialize the progress bar values
setProgressBarValues();
// changing the timer status to started
timerStatus = TimerStatus.STARTED;
// call to start the count down timer
startCountDownTimer();
} else {
// changing the timer status to stopped
timerStatus = TimerStatus.STOPPED;
stopCountDownTimer();
}
}
private void setTimerValues(String minutes) {
int time = 0;
if (!minutes.isEmpty() || Integer.parseInt(minutes) != 0) {
time = Integer.parseInt(minutes);
}
// assigning values after converting to milliseconds
timeCountInMilliSeconds = time * 60 * 1000;
}
private void startCountDownTimer() {
handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
countDownTimer = new CountDownTimer(timeCountInMilliSeconds, 1000) {
@Override
public void onTick(long millisUntilFinished) {
textViewTimeCV.setText(hmsTimeFormatter(millisUntilFinished));
progressBarCV.setProgress((int) (millisUntilFinished / 1000));
}
@Override
public void onFinish() {
textViewTimeCV.setText(hmsTimeFormatter(timeCountInMilliSeconds));
// call to initialize the progress bar values
setProgressBarValues();
// changing the timer status to stopped
timerStatus = TimerStatus.STOPPED;
}
}.start();
}
}, 1000);
}
private void stopCountDownTimer() {
countDownTimer.cancel();
}
private void setProgressBarValues() {
progressBarCV.setMax((int) timeCountInMilliSeconds / 1000);
progressBarCV.setProgress((int) timeCountInMilliSeconds / 1000);
}
private String hmsTimeFormatter(long milliSeconds) {
String hms = String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(milliSeconds),
TimeUnit.MILLISECONDS.toMinutes(milliSeconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliSeconds)),
TimeUnit.MILLISECONDS.toSeconds(milliSeconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliSeconds)));
return hms;
}
}
模型类
public class Task {
private String title;
private String time;
public Task() {
}
public Task(String title, String description, String time) {
this.title = title;
this.time = time;
}
public String getTitle() {
return title;
}
public void setTitle(String name) {
this.title = name;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
}
适配器类
public class TaskAdapter extends RecyclerView.Adapter<MyViewHolder> {
private List<Task> taskList;
public TaskAdapter(List<Task> taskList) {
this.taskList = taskList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.cardview_layout, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Task task = taskList.get(position);
holder.title.setText(task.getTitle());
holder.textViewTimeCV.setText(task.getTime());
holder.startStop(task.getTime());
}
@Override
public int getItemCount() {
return taskList.size();
}
}
最后是我的活动课
public class MainActivity extends AppCompatActivity {
Task task;
private FloatingNavigationView mFloatingNavigationView;
public List<Task> taskList = new ArrayList<>();
private RecyclerView recyclerView;
public TaskAdapter tAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
/*startActivity(new Intent(MainActivity.this, SecondActivity.class));*/
// just some data to make a timer
prepareTaskData("jakldsj","asasd" , String.valueOf(1));
}
});
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
tAdapter = new TaskAdapter(taskList);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setAdapter(tAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
private void prepareTaskData(String title, String description, String time) {
method to set the values into the list
task = new Task(title, description, time);
taskList.add(task);
tAdapter.notifyDataSetChanged();
}
}
答案 0 :(得分:0)
我花了几天时间终于找到了解决方案。错误在于活动中的notifyDataChanged()
方法。 Recyclerview,使用这种方法重复使用卡片,这就是为什么定时器停止的原因(当卡片正在回收,所有进程都停止时,并且在Holder类的startStop()
方法中我们只是在“else”情况下)。在prepareTaskData()
中,只需更改tAdapter.notifyItemChanged(taskList.size()-1);
希望,这对某人有用