- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的用例非常简单,我有一个 RecyclerView
并且 RecyclerView
中的每个项目都有一个计时器,该计时器应该倒计时到 10 秒(例如)并每秒更新 ViewHolder
中的 TextView
以显示剩余时间(以秒为单位)。
我创建了一个定时器类如下
public class BurnTimerTask2
{
private System.Timers.Timer t = new System.Timers.Timer(1000);
private int Secs;
private TextView tv;
public BurnTimerTask2(int Secs, TextView tv)
{
this.Secs = Secs;
this.tv = tv;
t.Elapsed += T_Elapsed;
t.Start();
}
private void T_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Android.Util.Log.Debug("PMBurnTimers", "Timer: " + Secs);
Secs--;
tv.Text = Secs + " Seconds left";
if (Secs == 0)
t.Stop();
}
}
在我的OnBindViewHolder
中,我是这样调用它的
if (!MYLIST[position].TimerTriggered)
{
MYLIST[position].TimerTriggered= true;
new BurnTimerTask2(10, viewHolder.Textview);
}
else
{
viewHolder.Textview.Text = "TIMER ALREADY TRIGGERED";
}
new BurnTimerTask2(10, viewHolder.Textview);
是我调用计时器类并传递 TextView
的地方(在上面的代码中,我检查计时器是否是否已被触发,如果已被触发,我不会调用计时器类,因此我不会为同一项目设置多个计时器)
问题:
1- 显示秒数的 TextView
不会更新,除非我稍微滚动 RecyclerView
,一旦我稍微滚动 RecyclerView
它就会开始计时并按预期更新 TextView
的文本。
2- 一旦调用 Timer 类,我的 Activity
中的 UI 就会变得无响应,我无法与 RecyclerView
之外的任何内容交互几秒钟,当我可以这么慢,如果我单击一个按钮,则需要很长时间才能触发该按钮上的操作。 (注意:这只会在我更新 TextView
时发生,如果我不更新 TextView
并自行运行计时器,一切正常所以最终不是导致它的计时器,而是从导致它的计时器更新 TextView
)
显然我没有以正确的方式更新 TextView。我尝试了以下
1- 在适配器内运行计时器(同样的问题)
2- 为此处指出的 ViewHolder
中的每个项目创建一个计时器 Countdown timer in recyclerview not working properly (同样的问题)
根据以下文章,我正在做的应该只是简单的工作,但它没有 How to handle multiple countdown timers in RecyclerView?和 https://github.com/Manikkumar1988/TimerInRecyclerView
我不确定如何解决这个问题。任何想法
最佳答案
您好,我有一个使用 Chronometer(https://developer.android.com/reference/android/widget/Chronometer)的想法。它是 TextView 的子项,但会自行处理计数和更新 View 。
想法是让您的列表的 viewHolder 持有这个 Chronometer,然后在您的 onBindViewHolder() 中让这个 Chronometer 计算正确的时间(如果每个项目计算不同的时间)。
试试这个适配器,我为列表中的每个项目都有一个单独的计时器,我将在 onBindViewHolder 上将该计时器绑定(bind)到 Chronometer 中。尝试看看是否可以使用计时器类替换 myTimers[]。
public class SOAdapter extends RecyclerView.Adapter<SOAdapter.ViewHolder> {
Context context;
int timerNumber;
Chronometer[] myTimers;
SOAdapter(Context context, int timerNumber){
this.context = context;
this.timerNumber = timerNumber;
this.myTimers = new Chronometer[timerNumber];
for (int i = 0; i < timerNumber; i++){
Chronometer c = new Chronometer(context);
c.setTextSize(30);
c.setBase(SystemClock.elapsedRealtime());
c.start();
myTimers[i] = c;
}
}
@NonNull
@Override
public SOAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Chronometer timer = new Chronometer(context);
timer.setLayoutParams(new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
timer.setTextSize(30);
timer.setBase(SystemClock.elapsedRealtime());
timer.start();
return new ViewHolder(timer);
}
@Override
public void onBindViewHolder(@NonNull SOAdapter.ViewHolder holder, int position) {
Chronometer cur = myTimers[position];
holder.bindTimer(cur);
}
@Override
public int getItemCount() {
return timerNumber;
}
public class ViewHolder extends RecyclerView.ViewHolder{
Chronometer displayTimer;
ViewHolder(Chronometer timer) {
super(timer);
displayTimer = timer;
}
public void bindTimer(Chronometer timer){
displayTimer.setBase(timer.getBase());
}
}
}
关于c# - 在没有 NotifyDatasetChanged() 的情况下更新定时器上 RecyclerView 适配器中的 TextView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66961723/
我正在尝试在我的 recyclerview 方法上实现此方法 Changing background color of selected item in recyclerview 我正确地遵循了脚本,
我有一个列表,其中填充了自定义 ArrayAdapter。 我想每秒更新一个进度条,所以我尝试使用 notifyDataSetChanged() 来重新绘制列表,但它似乎不起作用。 最佳答案 您如何更
我正在改进我的应用程序稳定性和性能,但现在我遇到了来自 Android Studio 的警告。请考虑以下适配器类: private class CoinsAdapter(private val fra
我正在制作一个Android来做名为list track的列表应用程序,现在我仍在研究该应用程序的基础知识。无论如何,我为列表 View 创建了一个上下文菜单,该上下文菜单只有1个选项“删除”,它的意
我想从另一个线程调用adapter.notifyDataSetChanged()。我读到我应该使用 AsyncTask 并在执行后执行 adapter.notifyDataSetChanged() 。
我知道这个问题已被问过数千次,但由于某种原因我找不到适合我的情况的答案。 我拥有的是一个从 Web 服务获取数据并用信息填充列表的线程。然后我想按下一个按钮并调用同一线程来获取更多数据并将其添加到列表
friend , 我正在为 android ListView 使用以下自定义适配器我面临的问题是调用 notifydatasetchanged() 后位置错误; 我第一次将数据与列表位置绑定(bind
我在 windows 7 64bit 下使用 android 1.6当我从扩展 BaseAdapter 的适配器对象调用 notifyDataSetChanged() 时,我得到了运行时异常 我尝试使
我有一个类 Myadapter extends BaseAdapter.in Myadapter 我更改了 MyListView 数据然后调用 notifyDataSetChanged() 方法,比如
我一直在寻找年龄并尝试了几个月。我永远无法让我的观点(任何观点)无效。这里有什么问题,任何人都可以告诉我吗?谁能告诉我如何使用这些无效方法。提前致谢! if(resul
在我的 Activity 中,我有两个 ListView ,因此我使用了两个不同的适配器。我的要求是在两个列表项中我都有一个按钮。单击任何 ListView 中的按钮,两个 ListView 中的数据
我有一个用于我的 ListView 的适配器,然后我需要使用 SensorChange 方法中的 notifydatasetchanged 方法刷新它。你知道 SensorChange 方法被频繁快速
我正在使用 FragmentStatePagerAdapter 来实现 VerticalPageAdapter 的目的,我必须为与 Button< 相关的相同 Fragment 创建动态编号 被按下,
这个问题在这里已经有了答案: Custom Adapter getView() method is not called (6 个答案) 关闭 7 年前。 这是我的代码我想在 ListView 中显
我正在尝试做的事情: 按下添加按钮时,将值从 EditText 插入到数据库。 用数据库中的数据填充 ListView 。 问题: 当我单击添加按钮时,它会将值插入到数据库中,但不会将其填充到 Lis
我正在尝试制作一个像 tinder 一样刷卡的应用程序。我有一个 Texview 上面有一些文字,当我刷下一张卡片时有另一个文字等等。我还想做的是当我单击一个按钮以删除屏幕上的卡片并转到下一张时。我正
我正在制作一个程序,该程序将寻找与手机蓝牙设备配对的程序,显示它们及其地址以供用户查看,并且当用户已经在他的手机中打开 Bt 时它工作正常。当他不这样做时会出现问题,导致添加到 arrayList 中
有人可以向我解释以下问题的来源: 我有一个列表,根据某些偏好显示多个项目。用户可以通过 SlidingDrawer 更改这些首选项。每当发生这种情况时,我都会获得与新首选项相对应的项目,然后使用以下代
我有一个 ListView ,它使用不同类中的基本适配器显示来 self 的数据库的多个数据。每次我删除或添加一个项目到我的数据库时,我都想刷新我的 ListView 。 这是我的代码,但它没有刷新我
在我的代码中,我有两个 Activity 。 一个是 ListView Activity ,另一个 Activity 用于修改数据。修改数据后,用户将返回到 ListView Activity 。 我
我是一名优秀的程序员,十分优秀!