在我的recyclerView
适配器中,我实现了15秒的简单CountDownTimer,在这个实现中countDownTimer工作得很好,在recylcerview
列表中,我在布局视图中有一些countDownTimer,当当前行有countDownTimer再次启动时,我想启动和停止这个countDownTimer,当countDownTimer不可见或它没有显示在列表中时,必须停止。类似于Instagram播放和停止视频
简化的适配器:
public class InstagramFeedsAdapter extends RecyclerView.Adapter<InstagramFeedsAdapter.InstagramFeedsViewHolder> {
...
@Override
public void onBindViewHolder(final InstagramFeedsViewHolder holder, int position) {
holder.bind(position);
}
public class InstagramFeedsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
...
private boolean expanded;
private CountDownTimer timer;
public InstagramFeedsViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
ButterKnife.bind(this, itemView);
}
@Override
public void onClick(View v) {
}
public void bind(int position) {
if (timer != null) {
timer.cancel();
}
timer = new CountDownTimer(15000, 1000) {
@SuppressLint("DefaultLocale")
@Override
public void onTick(long leftTimeInMilliseconds) {
pager_count_down_timer.setVisibility(View.VISIBLE);
long seconds = leftTimeInMilliseconds / 1000;
pager_count_down_timer.setText(String.format("%02d", seconds % 60));
}
@Override
public void onFinish() {
pager_count_down_timer.setVisibility(View.GONE);
timer = null;
}
}.start();
}
}
现在,我如何在可见性项目上启动和停止此countDownTimer?
发布于 2019-01-06 17:32:05
代码的问题是,任何时候绑定ViewHolder
,然后从RecyclerView
解除绑定,CountDownTimer
都会从头开始,除非ViewHolder
没有回收,在这种情况下,使用RecyclerView
的意义很小。
您应该做的是从ViewHolder
中删除Timer
的关联,并将其附加到适配器列表。这样,您就可以分别跟踪计时器在每个项目中经过了多少时间。
您可以使用onViewAttachedToWindow(VH holder)
和onViewDetachedFromWindow(VH holder)
在RecyclerView.Adapter
中启动或停止/暂停Timer
,然后可以使用getAdapterPosition()
更新适配器列表。
发布于 2019-01-06 18:29:39
instagram_feeds.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int firstVisibleItem = layoutManager.findFirstCompletelyVisibleItemPosition();
if (lastPos == firstVisibleItem) {
return; //to prevent timer to restart if row position not changed
}
lastPos = firstVisibleItem;
if (mCounter != null) {
mCounter.cancel();
}
final InstagramFeedsAdapter.InstagramFeedsViewHolder vh = (InstagramFeedsAdapter.InstagramFeedsViewHolder) instagram_feeds
.findViewHolderForAdapterPosition(firstVisibleItem);
mCounter = new CountDownTimer(15000, 1000) {
@SuppressLint("DefaultLocale")
@Override
public void onTick(long leftTimeInMilliseconds) {
vh.pager_count_down_timer.setVisibility(View.VISIBLE);
long seconds = leftTimeInMilliseconds / 1000;
vh.pager_count_down_timer.setText(String.format("%02d", seconds % 60));
}
@Override
public void onFinish() {
vh.pager_count_down_timer.setVisibility(View.GONE);
mCounter = null;
}
}.start();
}
});
https://stackoverflow.com/questions/54060020
复制相似问题