gpt4 book ai didi

android - 计时器不会在应用程序小部件 ListView 中更新

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:43:28 61 4
gpt4 key购买 nike

我有一个显示计时器的应用小部件。计时器可以启动、停止或恢复。

在 Android 8 上,计时器有时不计时 (50/50)。一些用户提示 Android 7 上的这个问题,但我不确定这是否是同一个问题。在安装了 Android 6 的 Nexus 5 上一切正常。如果向下滚动 ListView (直到计时器不可见)并向上滚动 - 计时器开始计时。如果我在 ListView 上方再放一个 Chronometer 并开始 - chronometer 运行良好

ActivitiesRemoteViewsFactory

public RemoteViews getViewAt(int position) {
...

RemoteViews remoteViews = new RemoteViews(mContext.getPackageName(), getItemLayoutId());

if (timeLog.getState() == TimeLog.TimeLogState.RUNNING) {

remoteViews.setChronometer(R.id.widget_timer,
SystemClock.elapsedRealtime() - (duration * 1000 + System.currentTimeMillis() - timeLog.getStartDate().getTime()), null, true);
} else {
long timerValue = SystemClock.elapsedRealtime() - duration * 1000;
remoteViews.setChronometer(R.id.widget_timer, timerValue, null, false);

}

return remoteViews;

更新从AppWidgetProvider的onReceive方法发送

public void onReceive(Context context, Intent intent) {   
AppWidgetManager widgetManager = AppWidgetManager.getInstance(ctx);
...
widgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.widget_activities_list);
}

TargetSDK 为 25

更新该问题也在主应用程序中重现。 listView 有问题,因为它在 RecyclerView 中运行良好。在 https://github.com/zaplitny/WidgetIssue 添加了重现问题的简单示例

最佳答案

Chronometer 小部件已在 API 25 和 API 26 之间更新,以防止更新不可见的计时器。 (这是我查看底层代码的最佳猜测。)具体来说,更改了 updateRunning() 方法以考虑是否显示小部件。来自 Chronometer.java:

对于 API 25:boolean running = mVisible && mStarted;

对于 API 26:boolean running = mVisible && mStarted && isShown();

isShown() 是您问题的根源,它会阻止您的Chronometers 被重用。对于 API 26+,重用的 Chronometers 似乎在 ListView 中时不会更新。

有几种方法可以解决这个问题。首先是不要重用 Chronometers。在适配器的 getView() 中,您可以使用以下代码:

if (view == null || Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
view = LayoutInflater.from(getContext()).inflate(R.layout.widget_timer, parent, false);
}

使用此代码,您将始终创建新的Chronometers,并且永远不会重复使用它们。

另一种方法是在小部件布局后调用 chronometer.start() 并且 isShown() 将为真。将以下代码添加到 getView():

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
chronometer.start();
} else {
view.post(new Runnable() {
@Override
public void run() {
chronometer.start();
}
});
}

两种方法都行,还有其他方法。

关于android - 计时器不会在应用程序小部件 ListView 中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49026265/

61 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com