Android 当数据集为空时,RemoteViewsFactory调用getViewAt

Android 当数据集为空时,RemoteViewsFactory调用getViewAt,android,android-widget,remoteview,stackview,Android,Android Widget,Remoteview,Stackview,我正在为我的应用程序开发基于StackView的小部件,它应该会显示一些项目。由于用户操作的不同,项目的数量可能会有所不同——比如说,这是某种收藏夹菜单。我已实现RemoteViewsFactory子代以生成StackView的视图: public class StackRemoteViewsFactory implements RemoteViewsFactory { private List<Item> data; private Context context

我正在为我的应用程序开发基于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),我在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
后代一起工作-有人能证实/反驳我的假设吗

这里也有同样的问题。由于解决方案还没有出现(Android 4.4在这里,它仍然存在),我认为目前最好的解决方案基本上是一个避免崩溃的解决方案。一些开发者会称之为“黑客”

目前:

public RemoteViews getViewAt(int position) {

    if (position >= getCount())
            return getLoadingView();
    }
    //.... Rest of your normal configuration
}

请确保在
getLoadingView()

上正确返回视图。我知道这很旧,但我碰巧遇到了相同的问题。数据集已更新,但RemoteViewsFactory不知何故使用了旧值“getCount”。您还发现了其他问题吗?@mdelolmo很遗憾,我没有找到解决此问题的方法,并重新修改了我的小部件,以显示单个项目,并使用<和>按钮浏览项目。下面的答案为我解决了此问题。这是一个解决办法,但很好:)@BojanIlievski我不介意接受khose的答案,他的解决方案真的应该有效,但是,一般来说,我的问题是关于这个bug的来源和AdapterViewAnimator的行为的解释。这对我很有效。它不再崩溃(到目前为止),它似乎跳过了这个例子,显示了“空”的小部件视图,这正是我想要的。不过,我想知道这是否只是StackView的问题?
public RemoteViews getViewAt(int position) {

    if (position >= getCount())
            return getLoadingView();
    }
    //.... Rest of your normal configuration
}