Android AppWidget Listview 更改所选图像按钮 onClick.



我有这个主屏幕小部件:

例如,更新徽标旁边的两个buttons很容易activity,因为我有来自 onUpdate 方法的 appWidgetIdAppWidgetProvider,但列表中的imagebuttons都是在getViewAt()方法的RemoteViewsFactory类中创建的。

@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。

我需要更改我单击的行中的图像按钮,但是因为我在活动中只有一个应用程序小部件 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

但仍然没有找到答案,这是我的第一个小部件。请帮忙。

谢谢;)

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

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提供此解决方案。

最新更新