Bonjour à tous,
J'ai réalisé une application proposant un widget. Ce widget comporte une listView dont les données se trouvent dans un fichier xml situé sur mon serveur web.
Le widget s'affiche bien, avec ma listView à l'intérieur.
En revanche, il ne se met pas du tout à jour, même lorsque je modifie les données de la ListView sur mon fichier xml. Le "android:updatePeriodMillis="1800000"" de mon fichier "widgetinfo.xml" n'a aucun effet.
Je suppose que c'est parce que je dois me focaliser sur la mise à jour de la listView mais je ne vois pas comment procéder. Avez-vous une solution à me proposer ?
Voici le code de ce widget :
WidgetProvider.java
WidgetService.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 public class WidgetProvider extends AppWidgetProvider { public static final String DATA_FETCHED = "mon.package.DATA_FETCHED"; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { final int N = appWidgetIds.length; for (int i = 0; i < N; i++) { Intent serviceIntent = new Intent(context, RemoteFetchService.class); serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); context.startService(serviceIntent); } super.onUpdate(context, appWidgetManager, appWidgetIds); } 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; } @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); if (intent.getAction().equals(DATA_FETCHED)) { int appWidgetId = intent.getIntExtra( AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); AppWidgetManager appWidgetManager = AppWidgetManager .getInstance(context); RemoteViews remoteViews = updateWidgetListView(context, appWidgetId); appWidgetManager.updateAppWidget(appWidgetId, remoteViews); } } }
ListProvider.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 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)); } }
RemoteFetchService.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 public class ListProvider implements RemoteViewsFactory { private ArrayList<ListItem> listItemList = new ArrayList<ListItem>(); 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() { if(RemoteFetchService.listItemList !=null ) listItemList = (ArrayList<ListItem>) RemoteFetchService.listItemList .clone(); else listItemList = new ArrayList<ListItem>(); } @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); ListItem listItem = listItemList.get(position); remoteView.setTextViewText(R.id.heading, listItem.title); remoteView.setTextViewText(R.id.content, listItem.description); 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() { } }
ConfigActivity.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 public class RemoteFetchService extends Service { private int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; private AQuery aquery; private String remoteJsonUrl = "http://www.monsite.fr/maliste.json"; public static ArrayList<ListItem> listItemList; @Override public IBinder onBind(Intent arg0) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent.hasExtra(AppWidgetManager.EXTRA_APPWIDGET_ID)) appWidgetId = intent.getIntExtra( AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); aquery = new AQuery(getBaseContext()); fetchDataFromWeb(); return super.onStartCommand(intent, flags, startId); } private void fetchDataFromWeb() { aquery.ajax(remoteJsonUrl, String.class, new AjaxCallback<String>() { @Override public void callback(String url, String result, AjaxStatus status) { processResult(result); super.callback(url, result, status); } }); } private void processResult(String result) { Log.i("Resutl",result); listItemList = new ArrayList<ListItem>(); try { JSONArray jsonArray = new JSONArray(result); int length = jsonArray.length(); for (int i = 0; i < length; i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); ListItem listItem = new ListItem(); listItem.title = jsonObject.getString("title"); listItem.description = jsonObject.getString("description"); Log.i("Heading",listItem.title); Log.i("Content",listItem.description); listItemList.add(listItem); } } catch (JSONException e) { e.printStackTrace(); } populateWidget(); } private void populateWidget() { Intent widgetUpdateIntent = new Intent(); widgetUpdateIntent.setAction(WidgetProvider.DATA_FETCHED); widgetUpdateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); sendBroadcast(widgetUpdateIntent); this.stopSelf(); } }
widgetinfo.xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 public class ConfigActivity extends Activity implements OnClickListener { private int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.configactivity); assignAppWidgetId(); findViewById(R.id.widgetStartButton).setOnClickListener(this); } private void assignAppWidgetId() { Bundle extras = getIntent().getExtras(); if (extras != null) appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); } @Override public void onClick(View v) { if (v.getId() == R.id.widgetStartButton) startWidget(); } private void startWidget() { Intent intent = new Intent(); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); setResult(Activity.RESULT_OK, intent); Intent serviceIntent = new Intent(this, RemoteFetchService.class); serviceIntent .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); startService(serviceIntent); this.finish(); } }
monManifest.xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:configure="mon.package.ConfigActivity" android:initialLayout="@layout/widget_layout" android:minHeight="50.0dip" android:minWidth="294.0dip" android:previewImage="@drawable/logo" android:resizeMode="vertical|horizontal" android:updatePeriodMillis="1800000" />
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 <receiver android:name=".WidgetProvider" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> <action android:name="mon.package.DATA_FETCHED" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widgetinfo" /> </receiver> <service android:name=".WidgetService" android:permission="android.permission.BIND_REMOTEVIEWS" /> <activity android:name=".ConfigActivity" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> </intent-filter> </activity> <service android:name=".RemoteFetchService" />
Merci par avance pour vos réponses.
Partager