Android AppWidget Listview更改选中的图像按钮onClick

时间:2014-03-13 09:13:12

标签: android android-appwidget remoteview

homescreen widget

buttons标识旁边的两个activity更新很容易,因为我从AppWidgetProvider获得了来自onUpdate方法的appWidgetId,但imagebuttons列表中的RemoteViewsFactory方法在getViewAt()方法中创建。

@Override
    public RemoteViews getViewAt(int position) {
        RemoteViews row = new RemoteViews(ctxt.getPackageName(), R.layout.list_row_widget);
        row.setTextViewText(R.id.tvDescription, items.get(position).name);

        Intent i = new Intent();
        Bundle extras = new Bundle();
        extras.putBoolean(TimeWidgetProvider.ACTION_WORK_START, true);
        extras.putInt(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        i.putExtras(extras);
        row.setOnClickFillInIntent(R.id.btnStartWork, i);

        return (row);
    }

所以每个人都有相同的id(R.id.btnStartWork),同样的appWidgetId不是行id,而是整个widget ID。

我需要在我点击的行中更改图像按钮,但因为我在Activity中只有一个appwidget id,而且每次使用时都是整个小部件:

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getBaseContext());
RemoteViews views = new RemoteViews(getBaseContext().getPackageName(), R.layout.widget_layout);
views.setImageViewResource(R.id.btnStartWork, R.drawable.button_active);
appWidgetManager.updateAppWidget(mAppWidgetId, views);

它会更改第一个图像按钮而不是所选按钮。

我试图从工厂传递远程视图行,但它没有用,因为我打电话时

appWidgetManager.updateAppWidget(mAppWidgetId, row);

使用整个窗口小部件的id,窗口小部件消失了,只有选定的行可见。我可以在列表中获取项目的位置,但它没有帮助,因为它不是viewId。 我已阅读了许多教程,包括:http://developer.android.com/guide/topics/appwidgets/index.html

但仍未找到答案,这是我的第一个小部件。请帮助。

谢谢;)

1 个答案:

答案 0 :(得分:0)

实际上解决方案非常简单,在getViewAt()方法中保存每个imagebuttonextras的位置:

extras.putInt(TimeWidgetProvider.POSITION, position);

然后在处理方法存储某处所选项目的索引

TimeWidgetProvider.selected = extras.getInt(TimeWidgetProvider.POSITION);

之后,请使用:

appWidgetManager.notifyAppWidgetViewDataChanged(mAppWidgetId, R.id.list);

最后再次在您之前存储的索引的getViewAt()方法更改imagebutton中。

if (position == TimeWidgetProvider.selected) {
    row.setImageViewResource(R.id.btnStartWork, R.drawable.button_active);
} else {
    row.setImageViewResource(R.id.btnStartWork, R.drawable.button_inactive);
}

使用所选项目的更改状态刷新整个列表。

此解决方案的Tamás Müller