空数据集时 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。所以我不明白为什么RemoteViewsFactorygetCount() 返回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

用于 Android 小部件的 RemoteViewsFactory 内的通用图像加载器