Android AppWidget ListView изменить выбранное изображение кнопка на клик
У меня есть виджет домашнего экрана:
Это легко обновить, например, два buttons
рядом с логотипом от activity
потому что у меня есть их appWidgetIds из метода onUpdate из AppWidgetProvider
, но 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);
}
поэтому каждый из них имеет одинаковый идентификатор (R.id.btnStartWork) и один и тот же appWidgetId, который является не идентификатором строки, а целым идентификатором виджета.
Мне нужно изменить кнопку image в строке, по которой я щелкнул, но, поскольку у меня есть только один идентификатор appwidget в Activity и его для всего виджета, каждый раз, когда я использую:
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);
с идентификатором всего виджета виджет исчез, и была видна только выбранная строка. Я могу получить позицию элемента в списке, но это не полезно, потому что это не viewId. Я прочитал много учебника, включая этот: http://developer.android.com/guide/topics/appwidgets/index.html
Но до сих пор не нашел ответ, Это мой первый виджет. Помогите, пожалуйста.
Спасибо;)
1 ответ
На самом деле решение было довольно простым, в 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 за это решение.