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

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);
		}
 
	}
 
}
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
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.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() {
	}
 
}
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
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();
	}
}
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
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();
 
	}
 
}
widgetinfo.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" />
monManifest.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
<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.