studio programacion herramientas fundamentos con avanzado aplicaciones android listview widget

programacion - manual de android en pdf



Los elementos en ListView en Widget no muestran (2)

Creo un ListView en mi widget y obtengo el resultado de un servicio web. No tengo ningún problema para obtener el resultado del servicio web, pero el resultado no se muestra en mi ListView e incluso updatePeriodMillis que actualiza el widget cada 30 minutos, no funciona.

Estoy siguiendo este ejemplo y agregué AsyncTask en la clase ListProvider , logré obtener el resultado y en lugar de usar el populateListItem() donde está así

private void populateListItem() { for (int i = 0; i < 10; i++) { ListItem listItem = new ListItem(); listItem.heading = "Heading" + i; listItem.content = i + " This is the content of the app widget listview."; listItemList.add(listItem); } }

Uso el código a continuación en mi AsyncTask en onPostExecute

public class ListProvider implements RemoteViewsFactory { private ArrayList<ListItem> listItemList = new ArrayList<ListItem>(); public ListProvider(Context context, Intent intent) { new GetJSONWebService().execute(); } class GetJSONWebService extends AsyncTask<Void, Void, String> { @Override protected String doInBackground(Void... params) { String str = null; try { HttpClient httpclient = new DefaultHttpClient(); HttpGet httpget = new HttpGet(URL_STRING); HttpResponse response = httpclient.execute(httpget); str = EntityUtils.toString(response.getEntity()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return str; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); try { JSONObject object = new JSONObject(result); JSONArray jArray = object.getJSONArray("DATA"); for (int i = 0, count = jArray.length(); i < count; i++) { try { JSONObject jsonObject = jArray.getJSONObject(i); ListItem listItem = new ListItem(); listItem.heading = jsonObject.getString("name").toString(); listItem.content = jsonObject.getString("description").toString(); listItemList.add(listItem); } catch (JSONException e) { e.printStackTrace(); } } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } }

Cuando se depura, agrega los elementos en mi listItemList pero no se muestra en mi widget ListView . ¿Como puedo resolver esto? Gracias de antemano.

Aquí está mi WidgetService

public class WidgetService extends RemoteViewsService { @Override public RemoteViewsFactory onGetViewFactory(Intent intent) { return (new ListProvider(this.getApplicationContext(), intent)); } }

Aquí está mi AppWidgetProvider

public class WidgetProvider extends AppWidgetProvider { @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); } 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; }


¿Has agregado adapter.notifyDataSetChanged() ?


getCount esto siguiendo la respuesta aquí. Descubrí que mi getCount siempre devuelve 0 y, por lo tanto, en lugar de usar AsyncTask , coloco mi llamada al servicio web onDataSetChanged() .