我正在为我的应用程序开发基于 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。所以我不明白为什么在返回 0 时RemoteViewsFactory
调用。据我了解,它就像一个常见的适配器,所以这种行为完全让我感到困惑。所以也许我的建议是不正确的,我做错了什么? getViewAt()
getCount()
RemoteViewFactory
更新
今天我改变了我的小部件布局,ListView
而不是StackView
在尝试修复一些 gui 错误时使用。现在一切正常。进一步的实验表明AdapterViewFlipper
与 StackView 有相同的问题。据我了解,在某些方面与AdapterViewAnimator
后代合作 - 任何人都可以确认/反驳我的假设吗?