我正在尝试从 firestore 集合中获取数据并将其显示为小部件中的列表,我对小部件逻辑如何工作不太有经验,所以我认为可能有一个函数可以在数据更新时调用小部件视图进行更新充满。
我基本上从a获取信息RemoteViewFactory
类,但由于 firebase 函数都是异步的,我不知道如何使小部件等待数据填充,或调用类中调用更新的函数。
目前我的班级是这样的:
public class TaskDataProvider implements RemoteViewsService.RemoteViewsFactory {
private static final String TAG = TaskDataProvider.class.getSimpleName();
private static final int TOTAL = 10;
List<Task> tasks = new ArrayList<>();
private Context context;
public TaskDataProvider(Context context) {
this.context = context;
}
@Override
public void onCreate() {
this.loadData(value -> this.tasks = value);
}
@Override
public void onDataSetChanged() {
this.loadData(value -> this.tasks = value);
}
@Override
public void onDestroy() {
}
@Override
public int getCount() {
return this.tasks.size();
}
@Override
public RemoteViews getViewAt(int position) {
final RemoteViews remoteViews = new RemoteViews(this.context.getPackageName(), R.layout.widget_task_item);
final Task currentTask = this.tasks.get(position);
remoteViews.setTextViewText(R.id.widget_task_item_title, currentTask.getTitle());
remoteViews.setTextViewText(R.id.widget_task_item_description, currentTask.getDescription());
return remoteViews;
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean hasStableIds() {
return true;
}
private void loadData(ResultListener<List<Task>> resultListener) {
FirebaseAuth auth = FirebaseAuth.getInstance();
FirebaseUser user = auth.getCurrentUser();
if (user != null) {
this.retrieveTasks(user.getUid(), resultListener);
}
}
private void retrieveTasks(String userId, ResultListener<List<Task>> resultListener) {
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
firestore.collectionGroup(this.context.getString(R.string.database_project_task_collection_name))
.whereEqualTo(Task.FIELD_ASSIGNEE, userId)
.whereEqualTo(Task.FIELD_STATUS, TaskStatus.STATUS_OPEN)
.get()
.addOnCompleteListener(task -> {
if (!task.isSuccessful()) {
Log.e(TAG, "Unable to retrieve task list", task.getException());
} else {
final QuerySnapshot result = task.getResult();
if (result != null) {
Log.d(TAG, String.format("Found tasks: %d", result.size()));
resultListener.onResult(result.toObjects(Task.class));
}
}
});
}
}
Both onCreate
and onDataSetChanged
正在打电话loadData
它负责从 firestore 获取集合数据,我知道当时两者onCreate
and onDataSetChanged
运行完毕tasks
属性仍未填充,因此我在小部件中渲染的列表中未填充任何内容。
我如何正确地从 firebase 获取信息,然后填写ListView
小部件包含该信息?