Я пытаюсь реализовать простой виджет коллекции для своего приложения, я пытаюсь показать ListView
внутри виджета, но ListView
зависает при загрузке... и никогда не заканчивает загрузку, и у меня есть данные в базе данных и в списке все еще застрял с ним.
Вот метод onUpdate
из моего класса AppWidgetProvider:
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
int length = appWidgetIds.length;
for (int x = 0; x < length; x++){
RemoteViews remote = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
Intent intent = new Intent(context,RViewsService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[x]);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
remote.setRemoteAdapter(R.id.list,intent);
remote.setEmptyView(R.id.list,R.id.empty);
remote.setTextViewText(R.id.title,Utilities.setDayOfWeek());
////////////////////////////////////////////////////////////////////////////////////////////////////////
Intent AddmateriaIntent = new Intent(context,AddMateria.class);
PendingIntent pendingItentForButtonAddMateria = PendingIntent.getActivity(context,0,AddmateriaIntent,0);
remote.setOnClickPendingIntent(R.id.add,pendingItentForButtonAddMateria);
remote.setOnClickPendingIntent(R.id.empty, pendingItentForButtonAddMateria);
appWidgetManager.updateAppWidget(appWidgetIds[x],remote);
}
super.onUpdate(context,appWidgetManager,appWidgetIds);
}
Я мог проверить, и метод onUpdate
завершил свою работу без ошибок. А вот RemoteViewService и RemoteViewsFactory тоже не показывают ошибку на logCat.
открытый класс RViewsService расширяет RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return new RViewFactory(getApplicationContext(),intent);
}
class RViewFactory implements RemoteViewsFactory {
private DBAdapter adapter;
private ArrayList<Materia> materias;
private Context context;
public RViewFactory(Context context,Intent intent){
this.context = context;
}
@Override
public void onCreate() {
adapter = new DBAdapter(context).openReadableDatabase();
materias = new ArrayList<Materia>();
Cursor cursor = adapter.query(Utilities.setDayAndTable(), new String[]{DBAdapter.ROW_SUBJECT,DBAdapter.ROW_COLOR_NAME,DBAdapter.ROW_COLOR_HEX}, null, null, null, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
while (!cursor.isAfterLast()) {
Materia materia = new Materia();
materia.setSubject(cursor.getString(cursor.getColumnIndex(DBAdapter.ROW_SUBJECT)));
materia.setColor(new ColorObject(cursor.getString(cursor.getColumnIndex(DBAdapter.ROW_COLOR_NAME)),
(cursor.getInt(cursor.getColumnIndex(DBAdapter.ROW_COLOR_HEX)))));
materias.add(materia);
Log.d("log", "Data: " + materia.getSubject());
cursor.moveToNext();
}
}
cursor.close();
}
}
@Override
public void onDataSetChanged() {
}
@Override
public void onDestroy() {
materias = null;
adapter.close();
}
@Override
public int getCount() {
return materias.size();
}
@Override
public RemoteViews getViewAt(int i) {
RemoteViews remote = new RemoteViews(context.getPackageName(),android.R.layout.simple_list_item_1);
remote.setTextViewText(android.R.id.text1,materias.get(i).getSubject());
remote.setTextColor(android.R.id.text1,materias.get(i).getColor().getColor());
return remote;
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public int getViewTypeCount() {
return 0;
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public boolean hasStableIds() {
return false;
}
}
}
И в LogCat я не могу найти ошибку или предупреждения при загрузке виджета, они отображаются только при чтении курсора (я стер текст из LogCat, потому что он был о GC).
Логкат
05-02 12:54:30.796 21885-21885/schooltimetable.app D/cannon﹕ Data: Math
05-02 12:54:30.806 21885-21885/schooltimetable.app D/cannon﹕ Data: Theory
И я уверен, что Cursor возвращает данные, потому что я зарегистрировал их в Logcat, и он сделал, как показано выше.
А это фрагмент Manifest, объявляющий AppWidgetProvider и RemoteViewService:
<receiver android:name="schooltimetable.app.appWidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/cannon_widget" />
</receiver>
<service android:name=".RViewsService" android:permission="android.permission.BIND_REMOTEVIEWS"/>
Я тестирую свое приложение на Nexus 7 (2012 г.): Android 4.4.2
Спасибо.