- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在为我的应用程序开发小部件,它基于 StackView 并且应该显示一些项目。项目的数量可能会因用户操作而异——可以说这是某种收藏夹菜单。我已经实现了 RemoteViewsFactory 后代来为 StackView 生成 View :
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
}
小部件第一次启动时一切正常 - 小部件成功显示空 View 并且一切顺利。在我将一些新元素添加到收藏夹后,我立即通知 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
首先,我检查了 onDataSetChanged()
触发后 getCount()
返回的内容 - 它是 0。所以我不明白为什么 RemoteViewsFactory
在 getCount()
返回 0 时调用 getViewAt()
。据我所知,RemoteViewFactory
就像一个普通的适配器,所以这行为完全让我困惑。所以也许我的建议是不正确的,我做错了什么?
更新
今天,我更改了我的小部件布局以使用 ListView
而不是 StackView
,同时尝试修复一些 gui 错误。现在一切正常。进一步的实验表明 AdapterViewFlipper
与 StackView 存在相同的问题。据我所知,有一些方面与 AdapterViewAnimator
后代一起工作 - 谁能证实/反驳我的假设?
最佳答案
同样的问题。由于解决方案尚未出现(这里是 Android 4.4,它仍然会发生),我认为目前最好的解决方案基本上是避免崩溃的解决方法。一些开发人员将其称为“hack”...
现在:
public RemoteViews getViewAt(int position) {
if (position >= getCount())
return getLoadingView();
}
//.... Rest of your normal configuration
}
确保在 getLoadingView()
上正确返回 View
关于android - RemoteViewsFactory 在数据集为空时调用 getViewAt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19384566/
我正在为我的应用程序开发小部件,它基于 StackView 并且应该显示一些项目。项目的数量可能会因用户操作而异——可以说这是某种收藏夹菜单。我已经实现了 RemoteViewsFactory 后代来
有时,当我的小部件正在更新时,我会在日志中看到: .. getViewAt position = 7 getViewAt position = 7.. RemoteViews 对象第一次放在位置 0,
我是一名优秀的程序员,十分优秀!