Via*_*lav 10 android android-widget stackview remoteview
我正在为我的应用程序创建基于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
}
Run Code Online (Sandbox Code Playgroud)
一切都在第一个小部件启动时运行良好 - 小部件成功显示空视图,一切顺利.在我向收藏夹添加一些新元素后,我立即通知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);
Run Code Online (Sandbox Code Playgroud)
一切都很顺利 - 数据集已成功更改,我在小部件上看到了我最喜欢的项目.但是当我从收藏夹中删除我的单个元素并且收藏夹变为空(当然通知AppWidgetManager)我在getViewAtMethod中收到IndexOutOfBoundsException:
10-15 17:26:36.810: E/AndroidRuntime(30964): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
Run Code Online (Sandbox Code Playgroud)
首先,我检查了火灾getCount()后返回的内容onDataSetChanged()- 它是0.所以我不明白为什么在返回0 时RemoteViewsFactory调用getViewAt().getCount()据我所知,RemoteViewFactory就像一个通常的适配器所以这种行为让我感到困惑.所以也许我对它的建议是不正确的,我做错了什么?
更新
今天我改变了我的小部件布局,ListView而不是StackView尝试修复一些gui bug.而且一切都很好.进一步的实验表明,AdapterViewFlipper与StackView具有相同的问题.据我所知,有些方面与AdapterViewAnimator后代有关 - 任何人都可以确认/反驳我的假设吗?
kho*_*ose 11
同样的问题在这里 由于解决方案还没有到来(Android 4.4在这里仍然会发生),我认为目前最好的解决方案基本上是一种避免崩溃的解决方法.一些开发人员称之为"黑客"......
目前:
public RemoteViews getViewAt(int position) {
if (position >= getCount())
return getLoadingView();
}
//.... Rest of your normal configuration
}
Run Code Online (Sandbox Code Playgroud)
确保正确返回视图 getLoadingView()
| 归档时间: |
|
| 查看次数: |
3022 次 |
| 最近记录: |