如何通知 Android Widget 重绘

Posted

技术标签:

【中文标题】如何通知 Android Widget 重绘【英文标题】:How to notify Android Widget to redraw 【发布时间】:2016-05-17 16:58:36 【问题描述】:

我有一个使用 RemoteViewsFactoryandroid 小部件来填充 ListView。

我的数据源是一个异步 JSON 调用,可以随时完成(它不是推送通知)。现在代码位于onDataChanged,如下所示:

@Override
public void onDataSetChanged() 

    // Subsequent calls to get the data.
    // Called when the widget onReceive ACTION_APPWIDGET_UPDATE procs.
    newsGetter.updateListFeed(null, new NewsGetter.OnUpdateListFeedFinishedListener() 
        @Override
        public void onUpdateListFeedFinished(VolleyError error) 
            //called when async call has finished. not sure what to call here?
        
    );

    Log.e(TAG, "******************************** onDataSetChanged PROVIDER");

每小时(我已将updatePeriodMillis 设置为每小时更新一次)我的AppWidgetProvider 收到一个onReceive 要求更新的电话(ACTION_APPWIDGET_UPDATE),因此我上面的代码运行。但是,在我的代码运行并更新feedItems 之后,即使在滚动时,UI 也不会更新。

所以我的问题是:如何使 UI 无效并告诉它重绘所有视图?

到目前为止我已经尝试过:

appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_list);

但这也会调用onDataChanged,这会导致无限循环,所以我不能使用它。

【问题讨论】:

你试过invalidateViews(); @MustansarSaeed 这只能在 ListView 上使用。我正在使用 RemoteViewsFactory,这意味着它是 RemoteView,不存在这样的调用。 答案是使用 LocalBroadcastManager 来做,见***.com/questions/35263508/… 【参考方案1】:

解决此问题的方法是使用LocalBroadcastManager 将消息从RemoteViewsFactory 发送到AppWidgetProvider。例如,请参见此处: Android onReceive not called

【讨论】:

以上是关于如何通知 Android Widget 重绘的主要内容,如果未能解决你的问题,请参考以下文章

如何通知 CTabCtrl 中的所有控件它们应该重绘啥(应该改变它们的大小)?

Android Widget 小部件(四---完结) 使用ListViewGridViewStackViewViewFlipper展示Widget

android涂鸦工具,笔刷的定义,撤销与重绘

Flutter Widget - Stack and Positioned 层叠绝对定位

如何让通知图标在 Android 8.0.0 上正确显示?

android 标签view