2017-07-22 16 views
1

我有多个倒计时定时器和回收视图的问题。当我添加新的计时器时,前一个停止。然后它很奇怪,当秒数相同时,许多计时器可以一次工作。我搜索了很多,但没有找到解决我的问题。请帮助我多个倒计时器回收器视图

我holder类

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; 
    } 
} 

Model类

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

我花了几天时间终于找到了解决方案。活动中的错误是notifyDataChanged()方法。 Recyclerview,使用这种方法重复使用卡片,这就是为什么定时器停止的原因(卡片回收时,所有进程停止,并且在Holder类的方法中,我们只是在“其他”情况下)。在prepareTaskData()只需更改最后一个字符串tAdapter.notifyItemChanged(taskList.size()-1);

希望,这对某人有用