Ich erstelle ein Widget für meine Anwendung, aber ich stehe fest, wenn ich die Listenansicht ausfüllen muss. Ich nehme jedes Element aus meiner Web-DB mit asynctask, die ich in der onCreate() meines WidgetDataProvider (der RemoteViewsService.RemoteViewsFactory implementiert) aufrufen. Das Problem ist, dass normalerweise, wenn ich das Widget erstelle nicht füllt die Liste und ich muss einige Sekunden warten, bevor das Widget auf meinem Homescreen freizugeben.Android-Widget mit von AsyncTask aufgefülltem ListView
Wenn ich packen und lassen Sie die Widgets es wie folgt angezeigt: empty widget
Wenn ich warten, um es erscheint rechts wie folgt aus: right widget
Hier ist mein Code:
AppWidget
public class AppWidget extends AppWidgetProvider {
static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.app_widget);
Intent intent = new Intent(context, LoginActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.widget_title, pendingIntent);
views.setRemoteAdapter(R.id.widget_listView, new Intent(context, WidgetService.class));
appWidgetManager.updateAppWidget(appWidgetId, views);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
for (int appWidgetId : appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId);
}
}
@Override
public void onEnabled(Context context) {
}
@Override
public void onDisabled(Context context) {
}
}
** ** WidgetService
public class WidgetService extends RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return new WidgetDataRemote(this, intent);
}}
WidgetDataRemote
public class WidgetDataRemoteimplements RemoteViewsService.RemoteViewsFactory {
Context context;
Intent intent;
ArrayList<String> date = new ArrayList<>();
ArrayList<String> subj = new ArrayList<>();
ArrayList<String> type = new ArrayList<>();
ArrayList<String> comment = new ArrayList<>();
JSONParser jsonParser = new JSONParser();
ArrayList<String> subjFromDb = new ArrayList<>();
int pippo = 0;
public WidgetDataRemote(Context context, Intent intent) {
this.context = context;
this.intent = intent;
}
@Override
public RemoteViews getViewAt(int position) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.item_widget);
remoteViews.setTextViewText(R.id.task_data, date.get(position));
remoteViews.setTextViewText(R.id.task_subject, subj.get(position));
remoteViews.setTextViewText(R.id.task_type, type.get(position));
remoteViews.setTextViewText(R.id.task_comment, comment.get(position));
return remoteViews;
}
@Override
public void onCreate() {
new LoadSubjects().execute();
}
@Override
public void onDataSetChanged() {
}
@Override
public void onDestroy() {
date.clear();
subj.clear();
type.clear();
comment.clear();
}
@Override
public int getCount() {
return date.size();
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public long getItemId(int id) {
return id;
}
@Override
public boolean hasStableIds() {
return true;
}
class LoadSubjects extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
subjFromDb.clear();
pippo = 0;
}
@Override
protected String doInBackground(String... args) {
List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("class", User.getClasse()));
JSONArray json = jsonParser.makeHttpRequestArray(Constants.URL_LOAD_SUBJECTS, "POST", params);
try {
if (!json.toString().equals("[null]")) {
for (int i = 0; i < json.length(); i++) {
JSONObject c = json.getJSONObject(i);
String subj = c.getString(Constants.TAG_NAME);
subjFromDb.add(subj);
}
} else {
pippo = 1;
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String file_url) {
if (pippo == 0) {
new LoadTasks().execute();
}
}
class LoadTasks extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pippo = 0;
}
@Override
protected String doInBackground(String... args) {
List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("id_class", User.getClasse()));
JSONArray json = jsonParser.makeHttpRequestArray(Constants.URL_LOAD_TASKS, "POST", params);
try {
if (!json.toString().equals("[null]")) {
for (int i = 0; i < json.length(); i++) {
JSONObject c = json.getJSONObject(i);
Date data = null;
try {
data = new SimpleDateFormat("yyyy-MM-dd").parse(c.getString(Constants.TAG_DATE));
} catch (ParseException e) {
e.printStackTrace();
}
String newDate = new SimpleDateFormat("dd/MM/yyyy").format(data);
if (subjFromDb.contains(c.getString(Constants.TAG_SUBJECT))) {
date.add(newDate);
subj.add(c.getString(Constants.TAG_SUBJECT));
type.add(c.getString(Constants.TAG_TYPE));
comment.add(c.getString(Constants.TAG_COMMENT));
}
}
} else {
pippo = 1;
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String file_url) {
if (pippo == 0){
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName thisWidget = new ComponentName(context, WidgetDataProvider.class);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.widget_listView);
// I use this to update the listview after fetch data. Is it correct?
}
}
}
}}