如何通知Android小部件重新绘制

3

我有一个使用RemoteViewsFactory的Android小部件,用于填充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(); 吗? - Mustansar Saeed
@MustansarSaeed 这仅适用于ListView。我正在使用RemoteViewsFactory,这意味着它是一个RemoteView,不存在此类调用。 - automaton
答案是使用LocalBroadcastManager来实现,参见http://stackoverflow.com/questions/35263508/android-onreceive-not-called - automaton
1个回答

1
这个问题的解决方案是使用LocalBroadcastManagerRemoteViewsFactoryAppWidgetProvider发送消息。例如,请参见此处: Android onReceive not called

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接