当空数据集时,RemoteViewsFactory调用getViewAt

时间:2013-10-15 15:02:01

标签: android android-widget remoteview stackview

我正在使用基于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.所以我不明白为什么RemoteViewsFactory在{getViewAt()时调用getCount() 1}}返回0.据我所知,RemoteViewFactory就像一个普通的适配器,所以这种行为让我感到困惑。所以也许我对它的建议是不正确的,我做错了什么?

更新
今天我改变了我的小部件布局,以便在尝试修复一些gui bug时使用ListView而不是StackView。而且一切都很好。进一步的实验表明AdapterViewFlipper与StackView具有相同的问题。据我所知,有些方面与AdapterViewAnimator后代有关 - 任何人都可以确认/反驳我的假设吗?

1 个答案:

答案 0 :(得分:11)

这里的问题相同。由于解决方案还没有到来(Android 4.4在这里仍然会发生),我认为目前最好的解决方案基本上是一种避免崩溃的解决方法。一些开发人员称之为“黑客”......

目前:

public RemoteViews getViewAt(int position) {

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

确保在getLoadingView()

上正确返回视图