空数据集时 RemoteViewsFactory 调用 getViewAt
Posted
技术标签:
【中文标题】空数据集时 RemoteViewsFactory 调用 getViewAt【英文标题】:RemoteViewsFactory called getViewAt when empty dataset 【发布时间】:2013-10-23 10:54:54 【问题描述】:我正在为我的应用程序开发基于 StackView 的小部件,并且应该显示一些项目。项目数量可能因用户操作而异 - 可以说它是某种收藏夹菜单。我已经实现了 RemoteViewsFactory 后代来为 StackView 生成视图:
public class StackRemoteViewsFactory implements RemoteViewsFactory
private List<Item> data;
private Context context;
public StackRemoteViewsFactory(Context context)
this.context = context;
data = new DAO(context).getFavouriteCards();
@Override
public void onDataSetChanged()
data = new DAO(context).getWidgetItems(); // refresh widget dataset
@Override
public int getCount()
return data.size();
@Override
public RemoteViews getViewAt(int position)
Item item = data.get(position);
// this is my problem and will be explained below -
// here I'm getting IndexOutOfBoundsException, position = 0
...
// I have omitted other methods to avoid verbosity
在第一次小部件启动时一切正常 - 小部件成功显示空视图并且一切顺利。在我将一些新元素添加到收藏夹后,我立即通知 AppWidgetManager:
AppWidgetManager widgetManager = AppWidgetManager.getInstance(getActivity());
ComponentName component = new ComponentName(getActivity(), MyWidgetProvider.class);
int[] widgetIds = widgetManager.getAppWidgetIds(component);
widgetManager.notifyAppWidgetViewDataChanged(widgetIds, R.id.widgets_stack);
此时一切都很好 - 数据集已成功更改,我在小部件上看到了我最喜欢的项目。但是,当我从收藏夹中删除我的单个元素并且收藏夹变为空(当然通知 AppWidgetManager)时,我在 getViewAtMethod 中收到 IndexOutOfBoundsException:
10-15 17:26:36.810: E/androidRuntime(30964): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
首先,我检查了getCount()
在onDataSetChanged()
触发后返回的内容-它是0。所以我不明白为什么RemoteViewsFactory
在getCount()
返回0 时调用getViewAt()
。据我所知理解,RemoteViewFactory
就像一个普通的适配器,所以这种行为完全让我感到困惑。所以也许我的建议是不正确的,我做错了什么?
更新
今天我改变了我的小部件布局以使用ListView
而不是StackView
,同时尝试修复一些 gui 错误。现在一切正常。进一步的实验表明AdapterViewFlipper
与 StackView 有相同的问题。据我了解,AdapterViewAnimator
后代在某些方面工作 - 任何人都可以确认/反驳我的假设吗?
【问题讨论】:
我知道这已经很老了,但我碰巧遇到了同样的问题。数据集已更新,但 RemoteViewsFactory 不知何故使用了旧值“getCount”。你有没有发现别的东西? @mdelolmo 不幸的是,我没有找到解决此问题的方法,并重新设计了我的小部件以显示单个项目并使用 按钮浏览项目。 下面的答案为我解决了这个问题。这是一种解决方法,但是很好:) @BojanIlievski 我不介意接受 khose 的回答,他的解决方案确实应该有效,但是,通常我的问题是关于这个错误的来源和 AdapterViewAnimator 行为的解释。 【参考方案1】:同样的问题。由于解决方案还没有出现(这里是 Android 4.4,它仍然会发生),我认为目前最好的解决方案基本上是避免崩溃的解决方法。一些开发者会称之为“hack”...
现在:
public RemoteViews getViewAt(int position)
if (position >= getCount())
return getLoadingView();
//.... Rest of your normal configuration
确保在 getLoadingView()
上正确返回视图
【讨论】:
这对我有用。它不再崩溃(到目前为止),它似乎跳过了这个案例并显示了“空”小部件视图,这正是我想要的。不过,我想知道这是否只是 StackViews 的问题?以上是关于空数据集时 RemoteViewsFactory 调用 getViewAt的主要内容,如果未能解决你的问题,请参考以下文章
用于内容的 Widget RemoteViewsFactory 中的 Android 权限拒绝
根本没有调用 RemoteViewsFactory 中的任何方法
无法在 RemoteViewsFactory 中加载多个图像
RemoteViewsFactory 如何处理 Android 中的 ViewTypes?
调用 notifyAppWidgetViewDataChanged 后,在 RemoteViewsFactory 中不调用 onDataSetChanged