Notifyappwidgetviewdatachanged не работает со списком в моем виджетеAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Notifyappwidgetviewdatachanged не работает со списком в моем виджете

Сообщение Anonymous »

Я перепробовал множество решений, но спустя несколько недель мне не удалось решить эту проблему: почему «notifyappwidgetviewdatachanged» не работает? как я могу обновить список, размещенный в моем виджете? Где я ошибаюсь?

Вот мои классы.

Поставщик виджетов:

public class Widget_Provider extends AppWidgetProvider
{
public static final String ACTION_MOSTRAORARI = "fACTION_TOAST";
public static final String EXTRA_STRING = "EXTRA_STRING";

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// There may be multiple widgets active, so update all of them
for (int appWidgetId : appWidgetIds)
{
RemoteViews views = updateWidgetListView(context, appWidgetId);

final Intent onItemClick = new Intent(context, Widget_Provider.class);
onItemClick.setAction(ACTION_MOSTRAORARI);
onItemClick.setData(Uri.parse(onItemClick.toUri(Intent.URI_INTENT_SCHEME)));
final PendingIntent onClickPendingIntent = PendingIntent.getBroadcast(context, 0, onItemClick, PendingIntent.FLAG_UPDATE_CURRENT);
views.setPendingIntentTemplate(R.id.myStopList, onClickPendingIntent);

appWidgetManager.updateAppWidget(appWidgetId, views);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}

public RemoteViews updateWidgetListView(Context context, int appWidgetId)
{
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
Intent svcIntent = new Intent(context, Widget_Service.class);
svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME)));
remoteViews.setRemoteAdapter(R.id.myStopList, svcIntent);
return remoteViews;
}

@Override
public void onReceive(Context context, Intent intent)
{
if (intent.getAction().equals(ACTION_MOSTRAORARI)) {

if (MainUtils.isNewtworkAvailable(context))
{
String item = intent.getExtras().getString(EXTRA_STRING);
Intent intentOrari = new Intent(context, Diag_MostraOrari.class);
intentOrari.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(intentOrari);
}
}

super.onReceive(context, intent);
}

@Override
public void onDeleted(Context context, int[] appWidgetIds) {}

@Override
public void onEnabled(Context context) {}

@Override
public void onDisabled(Context context) {}
}


Служба виджетов:

public class Widget_Service extends RemoteViewsService
{

@Override
public RemoteViewsFactory onGetViewFactory(Intent intent)
{
Map map = new TreeMap(String.CASE_INSENSITIVE_ORDER);

/* ---
* Here i fetch data from a local db and store it on "map"
*/ ---

return (new Widget_ListProvider(this.getApplicationContext(), intent, map));
}

}


ListProvider:

public class Widget_ListProvider implements RemoteViewsFactory
{
private Map map = new HashMap();
private ArrayList listItemList = new ArrayList();
private Context context = null;
private int appWidgetId;

public Widget_ListProvider(Context context, Intent intent, Map map)
{
this.map = map;
this.context = context;
appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);

populateListItem();
}

//This function populate the arraylist "listItemList" by the data stored on "map"
private void populateListItem() { [...] }

@Override
public int getCount() {
return listItemList.size();
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public RemoteViews getViewAt(int position)
{
final RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.listitem_widget);
ListItem_Widget listItem = listItemList.get(position);
remoteView.setTextViewText(R.id.heading, listItem.heading);
remoteView.setTextViewText(R.id.content, listItem.content);

final Intent fillInIntent = new Intent();
fillInIntent.setAction(Widget.ACTION_MOSTRAORARI);
final Bundle bundle = new Bundle();
bundle.putString(Widget.EXTRA_STRING, listItem.heading);
fillInIntent.putExtras(bundle);
remoteView.setOnClickFillInIntent(R.id.listrow, fillInIntent);

return remoteView;
}

@Override
public RemoteViews getLoadingView() {
return null;
}

@Override
public int getViewTypeCount() {
return 1;
}

@Override
public boolean hasStableIds() {
return true;
}

@Override
public void onCreate() {}

@Override
public void onDataSetChanged() {}

@Override
public void onDestroy() {}

}


XML моего пользовательского элемента списка содержит только два текстовых представления: «заголовок» и «содержание».

Где я ошибаюсь? почему, когда я вызываю «notifyappwidgetviewdatachanged» из другого действия, ничего не происходит?

[EDIT]

Это действие, в котором мне нужно обновить виджет.

public class Diag_Line extends AppCompatActivity
{
//[...]

@Override
protected void onCreate(Bundle savedInstanceState)
{
//[...]
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
ComponentName thisAppWidget = new ComponentName(getApplicationContext().getPackageName(), Widget.class.getName());
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget);
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.myStopList);

//"myStopList" is the id of my listview inside the widget xml.

//[...]
}
}


Подробнее здесь: https://stackoverflow.com/questions/473 ... -my-widget
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»