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 за это решение.

Другие вопросы по тегам