带有SQlite查询的Android App Widget

时间:2012-01-23 18:33:31

标签: android android-widget

我正在开发一个App Widget,它正在由一个服务进行更新,从AppWidgetProvider类的onUpdate()部分开始。问题是,每当我在窗口小部件服务中使用游标时,视图都不会添加到窗口小部件中。如果我只是替换字符串的sql查询/结果,它就可以工作。

不工作示例(使用ContentProvider / SQL):

    public class TestWidgetService extends Service {

    @Override
    public void onStart(Intent intent, int startId) {

        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());

        ComponentName thisWidget = new ComponentName(getApplicationContext(), TestWidget.class);

        int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);

        for (int widgetId : allWidgetIds) {

            RemoteViews remoteViews = new RemoteViews(
                    getApplicationContext().getPackageName(),
                    R.layout.test_widget
                    );

            // get items

            Uri items = Uri.parse(TestWidgetContent.CONTENT_URI + "/news/1");
            Cursor iCursor = getContentResolver().query(items, null, null, null, "ITM_TIMESTAMP DESC");
            if (iCursor == null) {
                continue;
            }
            else if (iCursor.moveToFirst()) {
                while (iCursor.isAfterLast() == false) {

                    Log.w("got", iCursor.getString(iCursor.getColumnIndex("FED_TITLE")));

                    RemoteViews item = new RemoteViews(
                            getApplicationContext().getPackageName(),
                            R.layout.test_widget_item
                    );

                    item.setTextViewText(
                            R.id.test_widget_item_feed,
                            iCursor.getString(iCursor.getColumnIndex("FED_TITLE"))
                        );

                    item.setTextViewText(
                            R.id.test_widget_item_title,
                            iCursor.getString(iCursor.getColumnIndex("ITM_TITLE"))
                        );

                    remoteViews.addView(R.id.test_widget_items, item);

                    iCursor.moveToNext();
                }
            }
            iCursor.close();


            //

            appWidgetManager.updateAppWidget(widgetId, remoteViews);
        }

        stopSelf();
        super.onStart(intent, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

此示例仅显示没有添加视图的布局“test_widget”,即使sql返回结果并添加了视图。

工作示例(仅限字符串):

public class TestWidgetService extends Service {

    @Override
    public void onStart(Intent intent, int startId) {

        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());

        ComponentName thisWidget = new ComponentName(getApplicationContext(), TestWidget.class);

        int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);

        for (int widgetId : allWidgetIds) {

            RemoteViews remoteViews = new RemoteViews(
                    getApplicationContext().getPackageName(),
                    R.layout.test_widget
                    );

            // get items

                    RemoteViews item = new RemoteViews(
                            getApplicationContext().getPackageName(),
                            R.layout.test_widget_item
                    );

                    item.setTextViewText(
                            R.id.test_widget_item_feed,
                            "feed"
                        );

                    item.setTextViewText(
                            R.id.test_widget_item_title,
                            "title"
                        );

                    remoteViews.addView(R.id.test_widget_items, item);

            //

            appWidgetManager.updateAppWidget(widgetId, remoteViews);
        }

        stopSelf();
        super.onStart(intent, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

这个工作示例显示了布局“test_widget”,其中的视图插入了LinearLayout id“test_widget_items”

我上周试图让这个小部件使用sql结果,任何人都有任何小小的想法可能出错?

1 个答案:

答案 0 :(得分:0)

原来这是模拟器的问题,在删除AVD快照并再次启动应用程序后,小部件很好