- Forum-Beiträge: 5
21.02.2017, 10:52:35 via Website
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() {
}
}