AppWidget ListView updaten

  • Antworten:3
Timo Weck
  • Forum-Beiträge: 5

21.02.2017, 10:52:35 via Website

Hallo liebe Community!

Ich habe heute mal wieder eine Frage vorbereitet:
Ich habe ein AppWidget mit einer ListView und einem Button; dieses Widget updatet sich alle 30 Minuten. Nun möchte ich, dass sich der Inhalt der ListView beim Klick auf den Button aktualisiert. Ich habe im Netz
schon herumgesucht, aber keine passende Lösung gefunden, daher bitte ich hier um Hilfe.

Mein Code:

WidgetProvider.java

public class WidgetProvider extends AppWidgetProvider {

private static final String ACTION_UPDATE_CLICK = "click";

private Date date;

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {
    final int N = appWidgetIds.length;

    for (int i = 0; i < N; ++i) {
        RemoteViews remoteViews = updateWidgetListView(context,
                appWidgetIds[i]);

        appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
        remoteViews.setOnClickPendingIntent(R.id.bMorgenWidget,
                getPendingSelfIntent(context,
                        ACTION_UPDATE_CLICK));
    }

    super.onUpdate(context, appWidgetManager, appWidgetIds);
}


private PendingIntent getPendingSelfIntent(Context context, String action) {
    Intent intent = new Intent(context, getClass());
    intent.setAction(action);
    return PendingIntent.getBroadcast(context, 0, intent, 0);
}

@Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);

    if (ACTION_UPDATE_CLICK.equals(intent.getAction())) {

    }
}

private RemoteViews updateWidgetListView(Context context, int appWidgetId) {

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
            R.layout.widget_layout);

    Intent svcIntent = new Intent(context, WidgetService.class);
    svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
    svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME)));
    remoteViews.setRemoteAdapter(appWidgetId, R.id.listViewWidget,
            svcIntent);
    remoteViews.setEmptyView(R.id.listViewWidget, R.id.empty_view);
    return remoteViews;
}

}

Was muss ich in der OnReceive()-Methode schreiben, damit sich das Widget und damit die ListView upatet?

WidgetService:

public class WidgetService extends RemoteViewsService {

@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
    int appWidgetId = intent.getIntExtra(
            AppWidgetManager.EXTRA_APPWIDGET_ID,
            AppWidgetManager.INVALID_APPWIDGET_ID);

    return (new ListProvider(this.getApplicationContext(), intent));
}

}

ListProvider:

public class ListProvider implements RemoteViewsFactory {
private ArrayList<Aktivitaet> listItemList = new ArrayList<>();
private Context context = null;
private int appWidgetId;

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

    populateListItem();
}

private void populateListItem() {
    AktivitaetDataSource dataSource = AktivitaetDataSource.getDataSource(context);
    dataSource.open();
    List<Aktivitaet> list = dataSource.getAktivitaeten(Calendar.getInstance());
    dataSource.close();
    Log.d("MainActivity", list.toString());
    for(int i=0;i<list.size(); i++){
        listItemList.add(list.get(i));
    }
}

@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.list_row);
    Aktivitaet listItem = listItemList.get(position);
    try {
        remoteView.setTextViewText(R.id.heading, new SimpleDateFormat("HH:mm").format(new SimpleDateFormat("HH-mm").parse(
                listItem.getUhrzeit())));
    } catch (ParseException e) {

    }
    remoteView.setTextViewText(R.id.content, listItem.getGeplanteAktivitaet());
    if(listItem.getEinschaetzung()==0){
        remoteView.setTextViewText(R.id.tv_einschaetzung_widget, "+");
    }else if(listItem.getEinschaetzung()==1){
        remoteView.setTextViewText(R.id.tv_einschaetzung_widget, "○");
    }else if(listItem.getEinschaetzung()==2){
        remoteView.setTextViewText(R.id.tv_einschaetzung_widget, "-");
    }
    if(listItem.getBewertung()==0){
        remoteView.setTextViewText(R.id.tv_bewertung_widget, "");
    }else if(listItem.getBewertung()==1){
        remoteView.setTextViewText(R.id.tv_bewertung_widget, "+");
    }else if(listItem.getBewertung()==2){
        remoteView.setTextViewText(R.id.tv_bewertung_widget, "○");
    }else if(listItem.getBewertung()==3){
        remoteView.setTextViewText(R.id.tv_bewertung_widget, "-");
    }else if(listItem.getBewertung()==4){
        remoteView.setTextViewText(R.id.tv_bewertung_widget, "x");
    }

    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() {
}

}

Antworten
swa00
  • Forum-Beiträge: 3.704

21.02.2017, 10:59:23 via Website

Hallo Timo ,

Benutze mal notifyDataSetChanged() auf deiner Liste.
Vielleicht hilft dir das schon

— geändert am 21.02.2017, 11:09:17

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Timo Weck
  • Forum-Beiträge: 5

21.02.2017, 12:07:38 via Website

Hallo swa00,

danke für deine Antwort.

Wie meinst du das? Ich habe ja keinen ArrayAdapter oder ähnliches, auf das ich notifyDataSetChanged() anwenden kann.
Bitte um weitere Hilfe.

Besten Gruß,
Timo

Antworten
swa00
  • Forum-Beiträge: 3.704

21.02.2017, 12:18:41 via Website

Wenn es vernünftig sein soll, verwendet man für solche Sachen aber einen Adapter,
dann müsstest du deinen Code dementsprechend erweitern.

Das Maximale, was dir nur noch bleibt ist mit invalidate() rumzuspielen.
Oder komplett neu füllen

Das ist aber alles nichts Halbes und Ganzes

— geändert am 21.02.2017, 12:35:55

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten