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() .